在 Python 3 中调用 super() 之前覆盖父类属性

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)

zvo*_*one 6

不存在“父母的attr“孩子的attr之分。该实例上只有一个attr,无论它是从父类中的代码设置的,还是从子类中的代码设置的,还是从没有该类的代码中设置的。

换句话说,这些示例产生相同的结果:

实施例1

class A:
    def __init__(self):
        self.attr = 1

class B(A):
    pass

b = B()
Run Code Online (Sandbox Code Playgroud)

实施例2

class A:
    pass

class B(A):
    def __init__(self):
        self.attr = 1

b = B()
Run Code Online (Sandbox Code Playgroud)

实施例3

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)