2013-04-13 9 views
8

Mam Family i jego odziedziczone klasy Person. Jak uzyskać atrybut familyName z klasy Person?Jak ustawić i uzyskać atrybut klasy nadrzędnej z odziedziczonej klasy w języku Python?

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

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

Na przykład, niech te Family i Person obiekty:

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

chciałbym zrobić coś takiego jak:

print richard.familyName 

i dostać 'Strauss'. Jak mogę to zrobić?

Odpowiedz

20

Nie możesz.

Instancje dziedziczą tylko metody i atrybuty klasy nadrzędnej, a nie atrybuty instancji. Nie powinieneś mylić tych dwóch.

strauss.familyName to instancja instancji atrybut instancji Family. Instancje o numerach Person miałyby własne kopie atrybutu familyName.

można normalnie kod konstruktora Person wziąć dwa argumenty:

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

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

Alternatywnym rozwiązaniem byłoby dla Person trzymać referencję do instancji Family:

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

gdzie Person nie dziedziczy po Family. Użyj go lubię:

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

print johaness.family.familyName 
+1

Dobra prezentacja opcji! –

4

Oprócz sugestii Martijns, można również tworzyć od osoby instancji rodziny, w ten sposób pozwalając rodzina śledzić jego członków:

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) 

Wykorzystanie takich jak ta:

>>> 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 
Powiązane problemy