gpt4 book ai didi

python - 适应具有多重继承的非合作父类(super class)

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

假设我正在使用一个提供以下类的库:

class A:
def __init__(self):
print("A")

class B(A):
def __init__(self):
print("B")
super().__init__()

然后我定义了一个 mixin 和一个子类:

class C:
def __init__(self):
print("C")
super().__init__()

class D(B, C):
def __init__(self):
print("D")
super().__init__()

创建一个新的D的输出是

D
B
A

我的目标是在初始化 D 时也调用 C 的 __init__不能修改 B 或 A。期望的输出将是

D
B
A
C

使用super 多重继承有各种各样的问题,比如this onethis one .来自 this post ,我知道要使合作子类化模式起作用,并且要调用 C.__init__BA 也需要调用 super,它将按方法解析顺序返回 C。 Hettinger 建议编写一个适配器类来处理这种“不合作”的情况。我可以为 B 编写适配器类,但与 Hettinger 的示例不同,B 是我继承的主要类,而不是混合类。我的理解是,我必须“重写”B 在其适配器中实现的每个方法才能正常工作,这似乎是不可行的,特别是如果 B 是一个大型库类,将来可能会改变行为。

那么有没有办法在不适应B或A的情况下获得C的初始化行为?

最佳答案

mixins 的第一条黄金法则:

始终首先继承mixin。


适当的 mixin 旨在支持多重继承,即它们有一个带有 *args, **kwargs 的构造函数调用 super().__init__(*args, **kwargs) (或者他们根本没有构造函数)。像这样的构造函数是完全透明和不引人注意的;它不会妨碍子类的构造函数。

当子类 (D) 调用 super().__init__() 时,它会调用 mixin 的 (C)构造函数,它将依次调用 B 的构造函数。换句话说,您的问题只需重新排序 D 的父类即可解决。

class D(C, B): 
def __init__(self):
print("D")
super().__init__()

D() # output: D C B A

如果出于某种原因,你绝对必须按 D B A C 的顺序调用构造函数,你应该显式调用父类的构造函数,而不是 super ():

class D(B, C): 
def __init__(self):
print("D")
B.__init__(self)
C.__init__(self)

D() # output: D B A C

关于python - 适应具有多重继承的非合作父类(super class),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48452702/

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