Python, nesneler oluşturma


132

Python öğrenmeye çalışıyorum ve şimdi sınıfları ve onları örneklerle nasıl değiştireceğimi anlamaya çalışıyorum.

Bu uygulama problemini anlayamıyorum:

Adı, yaşı ve ana dalı girdi olarak verilenlerle aynı olan bir öğrenci nesnesi oluşturun ve iade edin

def make_student(name, age, major)

Nesne derken ne anlama geldiğini anlamıyorum, bunlar fonksiyonun içinde bu değerleri tutan bir dizi oluşturmam gerektiği anlamına mı geliyor? veya bir sınıf yaratın ve bu fonksiyonun içinde olmasına izin verin ve örnekleri atayın? (bu sorudan önce benden adı, yaşı ve içinde branşı olan bir öğrenci sınıfı oluşturmam istendi)

class Student:
    name = "Unknown name"
    age = 0
    major = "Unknown major"

Veri modeli belgelerini okuyun, özellikle __init__yöntem burada ilgilidir: docs.python.org/2/reference/datamodel.html#object.__init__
wim

1
Yok (tırnak işaretleri yok)
python'da

Yanıtlar:


173
class Student(object):
    name = ""
    age = 0
    major = ""

    # The class "constructor" - It's actually an initializer 
    def __init__(self, name, age, major):
        self.name = name
        self.age = age
        self.major = major

def make_student(name, age, major):
    student = Student(name, age, major)
    return student

Python'un felsefesindeki ilkelerden biri "bunu yapmanın bir tane - ve tercihen sadece bir - bariz bir yolu olmalı" olsa da, bunu yapmanın birçok yolu vardır. Python'un dinamik yeteneklerinden yararlanmak için aşağıdaki iki kod parçacığını da kullanabilirsiniz:

class Student(object):
    name = ""
    age = 0
    major = ""

def make_student(name, age, major):
    student = Student()
    student.name = name
    student.age = age
    student.major = major
    # Note: I didn't need to create a variable in the class definition before doing this.
    student.gpa = float(4.0)
    return student

İlkini tercih ederim, ancak ikincisinin yararlı olabileceği durumlar var - biri MongoDB gibi belge veri tabanlarıyla çalışırken.


17
neden onları init'inizden önce sınıf değişkenleri olarak başlatıyorsunuz? (meraklı; bu kalıbı çok sık görmedim)
GoingTharn

7
Okunabilirlik amacıyla. Sınıf değişkenlerini initten önce en üste yakın bir yere koyarak, hepsi yapıcı tarafından ayarlanamayabileceğinden, hangi değişkenlerin sınıf kapsamında olduğunu hızlıca görebilirim.
Wulfram

1
Burada Öğrenci sınıfının örneği olan nesnenin adı öğrenci olarak kalacak değil mi? Her aramada ogrenci01, ogrenci02, .. isminde birden fazla nesne istersem ne olur?
Yathi

9
Örnek değişkenlerinizin ne olduğunu görmek için sınıf değişkenleri oluşturmak korkunç bir uygulamadır. Acemi okuyucular için: bunun yerine @ pyrospade'in cevabına bakın.
anon01

2
Örneğiniz yanıltıcıdır. Lütfen her öğrencinin bir özelliğini kötüye kullanmak yerine, gerçekte tüm öğrencilerin malı olan sınıf değişkeni adlarını kullanın. Örneğin: yerine class Unicornve has_hooves = Truekullanın name = "".
Tim Kuipers

49

Bir sınıf oluşturun ve ona bir __init__yöntem verin :

class Student:
    def __init__(self, name, age, major):
        self.name = name
        self.age = age
        self.major = major

    def is_old(self):
        return self.age > 100

Şimdi, Studentsınıfın bir örneğini başlatabilirsiniz :

>>> s = Student('John', 88, None)
>>> s.name
    'John'
>>> s.age
    88

Bununla make_studentaynı şeyi yapıyorsa neden bir öğrenci işlevine ihtiyacınız olduğundan emin değilim Student.__init__.


Öğretmenimiz bize sorunları doğru yapıp yapmadığımızı test eden bir test.py programı verdi. Soru, özellikle make_student işlevini kullanmamı istiyor. Nihai hedef şudur: s1 = make_student (isim, yaş, ana dal) ve şimdi s1'e atanmış her şeye sahibim. Ama yine de s1'in ne olmasını istediklerinden emin değilim? Bunu bir dizi {'name': name..etc} ile yapabilirim, ancak bu bana doğru bir cevap vermedi, bu yüzden sınıflardan ve örneklerden öğrendiklerimi uygulamam gerektiğini varsayıyorum
Mohsen M. Alrasheed

1
Doğrudan kodda oluşturmak yerine bir tür nesneyi yaratmak için bir yöntem veya işlevi kullandığınız "fabrika yöntemi" modeli, kullanışlı bir kalıptır, örneğin kalıtımla ilgili güzel şeylerden yararlanmanıza olanak tanır. . Bakın;)
bracco23

28

Nesneler, sınıfların örnekleridir. Sınıflar yalnızca nesnelerin taslağıdır. Sınıf tanımınıza göre -

# Note the added (object) - this is the preferred way of creating new classes
class Student(object):
    name = "Unknown name"
    age = 0
    major = "Unknown major"

make_studentÖznitelikleri yeni bir - örneğine açıkça atayarak bir işlev oluşturabilirsiniz Student-

def make_student(name, age, major):
    student = Student()
    student.name = name
    student.age = age
    student.major = major
    return student

Ancak bunu yapıcıda ( __init__) yapmak muhtemelen daha mantıklıdır -

class Student(object):
    def __init__(self, name="Unknown name", age=0, major="Unknown major"):
        self.name = name
        self.age = age
        self.major = major

Yapıcı, kullandığınızda çağrılır Student(). __init__Yöntemde tanımlanan argümanları alacaktır . Yapıcı imzası artık esasen olacaktır Student(name, age, major).

Bunu kullanırsanız, o zaman bir make_studentişlev önemsizdir (ve gereksizdir) -

def make_student(name, age, major):
    return Student(name, age, major)

Eğlenmek için, burada make_studentbir sınıf tanımlamadan bir işlevin nasıl oluşturulacağına dair bir örnek var . Lütfen bunu evde denemeyin.

def make_student(name, age, major):
    return type('Student', (object,),
                {'name': name, 'age': age, 'major': major})()

Aslında, sınıf Adı (nesne) yapmamayı tercih ederim: ayrıntı nedenlerinden dolayı. Python belgeleri de bunu yapma eğilimindedir. Ama bir diktede beslenmenin "tehlikeli" örneğini seviyorum. docs.python.org/2/tutorial/classes.html
Wulfram

1
Önceki yorumumu geri çekiyorum. Bkz stackoverflow.com/questions/4015417/... . Yani aslında sınıf adını (nesne) hecelemek için bir neden var:
Wulfram


__init__()Yöntem bir kurucudan nasıl farklıdır?
pyrospade

1
__init__bir kurucu değil, "çünkü nesne __init__çağrıldığı sırada zaten oluşturulmuş ve sınıfın yeni örneğine zaten geçerli bir başvurunuz var." ( diveintopython.net/object_oriented_framework/… )
Brian Z

3

preefine sınıfını kullanarak bir nesne oluşturduğunuzda, önce o nesneyi depolamak için bir değişken oluşturmak istersiniz. Daha sonra nesneyi oluşturabilir ve oluşturduğunuz değişkeni depolayabilirsiniz.

class Student:
     def __init__(self):

# creating an object....

   student1=Student()

Aslında bu init yöntemi, sınıfın kurucusudur. Bu yöntemi bazı öznitelikleri kullanarak başlatabilirsiniz .. Bu noktada, bir nesne oluşturduğunuzda, belirli öznitelikler için bazı değerler iletmeniz gerekecektir.

class Student:
      def __init__(self,name,age):
            self.name=value
            self.age=value

 # creating an object.......

     student2=Student("smith",25)
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.