gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 10:07:32 25 4
gpt4 key购买 nike

考虑以下示例。 Parent 类有一个名为 attr 的属性。 Child1Child2 都有一个同名的属性。 Child1Child2 之间的唯一区别是 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

实际答案;)

因此,Child1Child2 之间的区别在于 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com