【发布时间】: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 你提到的最后一个策略可能对我有用。