Python:当超类接受不同的参数时,正确的初始化方法是什么?

Dav*_*ver 24 python multiple-inheritance

如果我有三个这样的课程:

class BaseClass(object):
    def __init__(self, base_arg, base_arg2=None):
        ...

class MixinClass(object):
    def __init__(self, mixin_arg):
        ...

class ChildClass(BaseClass, MixinClass):
    def __init__(self, base_arg, mixin_arg, base_arg2=None):
        ???
Run Code Online (Sandbox Code Playgroud)

什么是初始化的正确方法MixinClassBaseClass

看起来不像我可以使用,super因为它MixinClassBaseClass两者都接受不同的参数......而且,两次调用,MixinClass.__init__(...)并且BaseClass.__init__(...),可能会导致钻石继承问题super被设计为阻止.

Chr*_* B. 13

基本上,在Python中,不能安全地支持这种类型的继承.幸运的是,你几乎从不需要,因为大多数方法都不关心什么什么,只是它支持特定的接口.您最好的选择是使用合成或聚合:让您的类继承其中一个父类,并包含对第二个类的实例的引用.只要您的类支持第二个类的接口(并将消息转发到包含的实例),这可能会很好.

在上面的示例中(两个类都继承自object),您可以(可能)安全地从两个类继承并使用MixinClass.__init__和调用两个构造函数BaseClass.__init__.但请注意,如果父类super构造函数中调用,则不安全.一个好的经验法则是super在父类使用时使用super,__init__如果父类使用__init__,并希望你永远不会从两个选择不同初始化方法的类继承.