njk*_*njk 2 python inheritance attributes class python-3.x
考虑以下示例。该类Parent有一个名为 的属性attr。和Child1都有Child2一个同名的属性。Child1和之间的唯一区别Child2是在覆盖父级属性之前Child1调用。相反,似乎不会覆盖父级的属性,因为该属性是在调用之前定义的。有没有办法在调用之前定义它时覆盖父级?super()attrChild2attrsuper()Child2attrsuper()
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"
Run Code Online (Sandbox Code Playgroud)
不存在“父母的attr”和“孩子的attr”之分。该实例上只有一个attr,无论它是从父类中的代码设置的,还是从子类中的代码设置的,还是从没有该类的代码中设置的。
换句话说,这些示例产生相同的结果:
class A:
def __init__(self):
self.attr = 1
class B(A):
pass
b = B()
Run Code Online (Sandbox Code Playgroud)
class A:
pass
class B(A):
def __init__(self):
self.attr = 1
b = B()
Run Code Online (Sandbox Code Playgroud)
class A:
pass
class B(A):
pass
b = B()
b.attr = 1
Run Code Online (Sandbox Code Playgroud)
Child1因此,和之间的区别Child2在于Child1's__init__执行以下操作:
self.attr = "parent"
self.attr = "child1"
Run Code Online (Sandbox Code Playgroud)
And有效Child2地__init__做到了这一点:
self.attr = "child2"
self.attr = "parent"
Run Code Online (Sandbox Code Playgroud)