【问题标题】:Accessing class variable defined in parent class in python访问python中父类中定义的类变量
【发布时间】:2022-10-24 16:34:30
【问题描述】:

我想在父类中设置一个类变量,然后在子类中对其进行操作。我有这样的代码:

class Parent():
    def unique_to_parent(self):
        self.c = "D"

class Child(Parent):
    def blah(self):
        print(self.c)

if __name__ == '__main__':
    thing = Child()
    thing.blah()

但这会导致:

Traceback (most recent call last):
  File "./test.py", line 16, in <module>
    thing.blah()
  File "./test.py", line 12, in blah
    print(self.c)
AttributeError: 'Child' object has no attribute 'c'

另一方面,如果将 Child.blah() 修改为这样:

def blah(self):
    super(Child, self).unique_to_parent()
    print(self.c)

我得到了所需的输出“D”。这对我来说似乎是错误的。如果我明确需要在方法unique_to_parent 中请求恰好对父级唯一的数据,那么继承的意义何在?如何在 Python 3.6 中完成这个简单的任务?

编辑: 出于某种原因,我不想在Child__init__ 函数中实例化变量c,尽管这似乎解决了问题(可能有副作用)。

【问题讨论】:

  • (1)“c”在这里是实例变量(或实例属性),而不是类变量(类的属性)。 (2)通常的方法是在“Parent”的构造函数中创建和设置这样的变量,然后在“Child”构造函数中调用“Parent”构造函数让它做它必须做的事情。
  • @MichaelButscher 我试过了,但是在thing.blah(子实例)中,c 的值与父级的__init__ 函数中的值一样,而不是unique_to_parent,即使父级中的一个方法更改了@ 的值与此同时,987654332@。 (需要验证)
  • 您的第一个示例没有调用unique_to_parent,因此c 甚至从未实例化。您可以做的一件事是class Parent: c = "D"(其中c = "D" 在新行中),您应该能够自动获得child.blah()。或者如果你想保持初始化变量的方式,你也可以只做thing = Child() 然后thing.unique_to_parent() 然后thing.blah()
  • 所以,类变量是可变的必须在在里面功能?
  • @kbunarjo 你提到的最后一个策略可能对我有用。

标签: python oop


【解决方案1】:

解决方案

要访问父类的属性,必须首先创建该属性。为此,必须调用声明变量的函数(在您的情况下为unique_to_parent)。为此,有两种方法:

  • 一,是在子类的构造函数中初始化父类,然后调用声明变量的函数(在你的情况下unique_to_parent)。这也可以用于访问在父类本身的构造函数中声明的变量。你的代码:

代码(第一种方式)

class Parent():
    def __init__(self):
        self.unique_to_parent()

    def unique_to_parent(self):
        self.c = "D"

class Child(Parent):
    def __init__(self):
        super().__init__()

    def blah(self):
        print(self.c)

if __name__ == '__main__':
    thing = Child()
    thing.blah()
  • 另一种方法是使用super() 直接调用从子类中声明变量的函数,就像@kbunarjo 的回答一样。不推荐这种方法,因为它会破坏程序的流程,我认为没有像第一种方式那样初始化父类的充分理由。

我希望这有帮助!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-04-08
    • 1970-01-01
    • 2011-03-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-28
    • 2019-04-10
    相关资源
    最近更新 更多