2013-04-13 13 views
8

Family ve onun kalıtsal Person sınıfları var. Person sınıfından familyName özniteliğini nasıl edinebilirim?Python'da miras alınan bir sınıftan bir üst sınıf özniteliği nasıl oluşturulur ve alınır?

class Family(object): 
    def __init__(self, familyName): 
     self.familyName = familyName 

class Person(Family): 
    def __init__(self, personName): 
     self.personName = personName 

Örneğin, bu Family ve Person nesneleri bakalım:

print richard.familyName 

ve 'Strauss' olsun:

strauss = Family('Strauss') 
johaness = Person('Johaness') 
richard = Person('Richard') 

ben gibi bir şey yapmak istiyorum. Bunu nasıl yapabilirim?

cevap

20

Yapamazsınız.

Örnekler, yalnızca üst sınıf yöntemleri ve öznitelikleri devralmaz, örnek öznitelikleri değil. İkisini karıştırmamalısın.

strauss.familyName, Family örneğinin bir örneği özniteliğidir. Person örneklerinde, familyName özniteliğinin kendi kopyaları olur.

normalde iki argüman almaya Person yapıcısı kodlayacağınıza:

class Person(object): 
    def __init__(self, personName, family): 
     self.personName = personName 
     self.family = family 

nerede Person artık: Person bir Family örneği başvurusu tutmak için

class Person(Family): 
    def __init__(self, personName, familyName): 
     super(Person, self).__init__(familyName) 
     self.personName = personName 

johaness = Person('Johaness', 'Strauss') 
richard = Person('Richard', 'Strauss') 

alternatif bir yaklaşım olacaktır Family'dan devralınır. hoşuna kullanın:

class Person(object): 
    def __init__(self, person_name, family): 
     self.person_name = person_name 
     self.family = family 

    def __str__(self): 
     return ' '.join((self.person_name, self.family.family_name)) 

class Family(object): 
    def __init__(self, family_name): 
     self.family_name = family_name 
     self.members = [] 

    def add_person(self, person_name): 
     person = Person(person_name, self) 
     self.members.append(person) 
     return person 

    def __str__(self): 
     return 'The %s family: ' % self.family_name + ', '.join(str(x) for x in self.members) 

Kullanımı böyle:

strauss = Family('Strauss') 
johaness = Person('Johaness', strauss) 
richard = Person('Richard', strauss) 

print johaness.family.familyName 
+1

Seçeneklerin iyi sunumu! –

4

Martijns önerilere ek olarak, ayrıca aile sıra üye takip icar, Aile örneğinden bu şekilde Kişi oluşturabilirsiniz:

>>> strauss = Family('Strauss') 
>>> johannes = strauss.add_person('Johannes') 
>>> richard = strauss.add_person('Richard') 
>>> 
>>> print johannes 
Johannes Strauss 
>>> print richard 
Richard Strauss 
>>> print strauss 
The Strauss family: Johannes Strauss, Richard Strauss 
İlgili konular