你能给我解释一下如何用Python编写致命的钻石吗?我看到了许多没有使用构造函数参数的类似代码示例,但一旦我开始使用参数,事情就开始变得一团糟
class A:
def __init__(self, a):
self.a = a
class B(A):
def __init__(self, a, b):
self.b = b
super().__init__(a)
class C(A):
def __init__(self, a, c):
self.c = c
super().__init__(a)
class D(B, C):
def __init__(self, a, b, c, d):
self.d = d
# How do I pass a and b to B.__init__
# and a and c to C.__init__
# using super() ?
super().__init__(a, b, c) #???
d = D(1, 2, 3, 4)
您的子类初始值设定项没有兼容的签名,这是正确协作超级调用的关键
这里的简单解决方案是通过在整个链中添加对varargs和任意关键字args的支持,使这些签名在规范上兼容,即:
当然,这并不能解决多重继承和协作
super
调用的每一个可能问题,但是MI很棘手,而且对可能发生的事情也有限制最简单的方法可能是每个子类接受kwargs的dict,并将其传递给上层:
在每次调用中,
__init__
获取所需的参数,并将其余参数传递给父类。唯一的缺点是必须将参数作为关键字传递相关问题 更多 >
编程相关推荐