2013-04-13 68 views
8

我有Family及其继承的Person类。我如何从Person类获得familyName属性?如何设置并从Python中的继承类获取父类属性?

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

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

例如,让这些FamilyPerson对象:

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

我想要做的事情,如:

print richard.familyName 

,并得到'Strauss'。我怎样才能做到这一点?

回答

20

你不能。

实例只继承父类的方法和属性,而不是实例属性。你不应该混淆这两者。

strauss.familyName实例实例的属性。 Person实例将拥有自己的副本的familyName属性。

你通常会编写的Person构造函数取两个参数:

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

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

另一种办法是Person举行参照Family实例:

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

其中Person不再继承自Family。使用它像:

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

print johaness.family.familyName 
+1

良好的选项介绍! –

4

除了Martijns建议,您也可以从家庭实例创建人,这样让家人保持它的成员跟踪:

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) 

用法是这样的:

>>> 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