【发布时间】:2017-06-10 17:13:37
【问题描述】:
这似乎是一项简单的任务,但我现在在这方面花费了太多时间,但没有解决方案。这是设置:
class A(object):
def __init__(self, x=0):
print("A.__init__(x=%d)" % x)
class B(object):
def __init__(self, y=1):
print("B.__init__(y=%d)" % y)
class C(A, B):
def __init__(self, x=2, y=3, z=4):
super().__init__(x=x, y=y)
print("C.__init__(z=%d)" % z)
是这样的想法,但这当然会导致
TypeError: __init__() got an unexpected keyword argument 'y'
所有其他尝试都以类似的方式失败,我可以在互联网上找到 no 资源并提供正确的解决方案。唯一的解决方案包括用*args, **kwargs 替换所有初始化参数。这并不真正适合我的需要。
根据要求,一个真实的例子:
(这使用了一种不同的方法,它具有有效的语法,但会产生不需要的结果。)
from PyQt5.QtCore import QObject
class Settings(object):
def __init__(self, file):
self.file = file
class SettingsObject(object):
def __init__(self, settings=None):
print("Super Init", settings is None)
self.settings = settings
class MyObject(QObject, SettingsObject):
def __init__(self, param):
print("Entering Init")
QObject.__init__(self)
SettingsObject.__init__(self, settings=Settings(__file__))
self.param = param
print("Leaving Init")
结果:
Entering Init
Super Init True
Super Init False
Leaving Init
我希望 Super Init True 行消失。
【问题讨论】:
-
super不调用 all 超类方法,只调用 下一个 方法。您目前无法正确设置C,因为它继承自具有不兼容接口的类。 -
那么没有办法从两个具有不同初始化签名的类继承?
-
除非层次结构中的所有类都正确使用
*args和**kwargs,因此它们至少兼容。 -
你能举一个不那么抽象的例子吗?完全不清楚为什么这令人惊讶(或“令人失望”)。您当然不应该自己调用层次结构中的所有其他方法,这就是
superfor 的用途。我也建议阅读 Liskov 替换原则。 -
不清楚的是你为什么这样做。你想在上面存储什么设置,为什么你决定使用多重继承来做到这一点?给出一些实际的背景——你真正想要实现的目标是什么,你为什么首先开始这样做?
标签: python python-3.x initialization multiple-inheritance