考虑以下示例。 Parent
类有一个名为 attr
的属性。 Child1
和 Child2
都有一个同名的属性。 Child1
和 Child2
之间的唯一区别是 Child1
在覆盖父级的 attr 之前调用
属性。 super()
Child2
似乎并没有覆盖父级的 attr
,因为该属性是在 super()
调用之前定义的。 Child2
在调用 super()
之前定义父级的 attr
时,有没有办法覆盖它?
class Parent():
def __init__(self):
self.attr = "parent"
class Child1(Parent):
def __init__(self):
super().__init__()
self.attr = "child1"
class Child2(Parent):
def __init__(self):
self.attr = "child2"
super().__init__()
if __name__ == '__main__':
child1 = Child1()
print(child1.attr) # "child1"
child2 = Child2()
print(child2.attr) # "parent"
最佳答案
没有“ parent 的attr
”和“ child 的attr
”这样的东西。该实例只有一个 attr
,无论它是从父类中的代码设置的,还是从子类中的代码中设置的,还是从没有类的代码中设置的。
换句话说,这些例子产生相同的结果:
例子1
class A:
def __init__(self):
self.attr = 1
class B(A):
pass
b = B()
例子2
class A:
pass
class B(A):
def __init__(self):
self.attr = 1
b = B()
示例 3
class A:
pass
class B(A):
pass
b = B()
b.attr = 1
实际答案;)
因此,Child1
和 Child2
之间的区别在于 Child1
的 __init__
执行此操作:
self.attr = "parent"
self.attr = "child1"
Child2
的 __init__
有效地做到了这一点:
self.attr = "child2"
self.attr = "parent"
关于python - 在 Python 3 中调用 super() 之前覆盖父类属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40195257/