如何在Python中从继承的类设置和获取父类属性?

msa*_*aio 19 python inheritance class

我有它Family和它继承的Person类.如何familyNamePerson课程中获取属性?

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

class Person(Family):
    def __init__(self, personName):
        self.personName = personName
Run Code Online (Sandbox Code Playgroud)

例如,让这些FamilyPerson对象:

strauss = Family('Strauss')
johaness = Person('Johaness')
richard = Person('Richard')
Run Code Online (Sandbox Code Playgroud)

我想做一些事情,比如:

print richard.familyName
Run Code Online (Sandbox Code Playgroud)

得到'Strauss'.我怎样才能做到这一点?

Mar*_*ers 33

你不能.

实例仅继承父类方法和属性,而不是实例属性.你不应该混淆两者.

strauss.familyName实例的实例属性Family.本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')
Run Code Online (Sandbox Code Playgroud)

另一种方法是Person保存对Family实例的引用:

class Person(object):
    def __init__(self, personName, family):
        self.personName = personName
        self.family = family
Run Code Online (Sandbox Code Playgroud)

这里Person不再继承Family.使用它像:

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

print johaness.family.familyName
Run Code Online (Sandbox Code Playgroud)


Len*_*bro 5

除了Martijns建议外,您还可以从Family实例创建Person,这样可以让Family跟踪其成员:

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)
Run Code Online (Sandbox Code Playgroud)

用法如下:

>>> 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
Run Code Online (Sandbox Code Playgroud)