【问题标题】:How to set and get a parent class attribute from an inherited class in Python?如何在 Python 中从继承的类中设置和获取父类属性?
【发布时间】:2013-04-06 00:50:15
【问题描述】:

我有 Family 及其继承的 Person 类。如何从Person 类中获取familyName 属性?

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'。我该怎么做?

【问题讨论】:

    标签: python class inheritance


    【解决方案1】:

    你不能。

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

    strauss.familyNameFamily 实例的instance 属性。 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
    

    【讨论】:

    • 很好的选项介绍!
    • 这是 7 年前的事了,但我找到了一种获取实例属性的方法,class_name.__init__(self)
    • @AdityaKendre:那行不通,因为这里Family.__init__() 接受了一个参数familyName。这就是为什么正确的解决方法是将familyName 参数添加到Person.__init__() 方法,然后调用super().__init__(familyName)。如果您传入额外的参数,您的class_name.__init__(self) 版本也可以工作,所以Family.__init__(self, familyName)。这只是调用父类的另一种方式,而super().__init__() 在使用多重继承时将继续工作。
    【解决方案2】:

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

    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
    

    【讨论】:

      猜你喜欢
      • 2020-11-08
      • 2021-09-06
      • 2021-01-25
      • 1970-01-01
      • 1970-01-01
      • 2020-10-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多