class A:
def __init__(self, x):
self.x
def show(self):
print("A:", self.x)
class B(A):
def __init__(self):
self.x = 20
def show(self):
super().show()
print("B:", self.x)
class C(B):
def __init__(self):
self.x = 30
def show(self):
super().show()
print("C:", self.x)
obj = C()
obj.show()
字符串
尝试了代码和不同的组合,但得到的答案是A=30,B-30和C=30需要A=10,B=20和C=30。
2条答案
按热度按时间lmyy7pcs1#
只有一个对象(它是
C
的示例),所以x
在每种情况下都引用相同的变量。因此,当您打印x
的值时,它不可能引用基类中的单独值。此外,正如注解中所指出的,
B
和A
的__init__
从未被实际调用(即使它们被调用,您也只是每次重写x
的当前值,所以它总是显示相同的值)。dwbf0jvd2#
只有
C
的__init__
方法被调用,self.x
只 * 曾经 * 设置为30
。即使您确实使用了super().__init__()
,x
的每个赋值都将覆盖之前的赋值-您仍然会得到一个值,这个值取决于super
调用与super
调用的顺序。分配任务对于给定的属性名称,示例只能有一个值。如果你真的希望不同的类具有不同的值,并且假设公共接口的其余部分是正确的,那么一个工作实现应该看起来像这样:
字符串
使用
__x
作为属性名调用 name mangling(请参阅为继承设计),这意味着A
实际上具有_A__x
,B
具有_B__x
,依此类推。这是故意防止子类覆盖其超类的属性--这通常不是一个好主意(例如,这不是习惯性的方法来创建“私有”属性),但是如果你 * 希望 * 每个属性都有一个单独的值,这就是你要做的。使用中:型
但是,请注意,外部访问
__x
也被阻止了,你必须具体说明 * 哪个 *__x
:型