Python 混合、多重继承、构造函数和数据

Python 混合、多重继承、构造函数和数据,python,multiple-inheritance,mixins,Python,Multiple Inheritance,Mixins,我有一门课: class A(object): def __init__(self, *args): # impl 也是一个“mixin”,基本上是另一个类,包含一些数据和方法: class Mixin(object): def __init__(self): self.data = [] def a_method(self): # do something 现在,我使用mixin创建了a的一个子类: class AW

我有一门课:

class A(object):
    def __init__(self, *args):
        # impl
也是一个“mixin”,基本上是另一个类,包含一些数据和方法:

class Mixin(object):
    def __init__(self):
        self.data = []

    def a_method(self):
        # do something
现在,我使用mixin创建了a的一个子类:

class AWithMixin(A, Mixin):
    pass

我的问题是,我希望同时调用A和Mixin的构造函数。我考虑过给AWithMixin一个自己的构造函数,在这个构造函数中调用了super,但是super类的构造函数有不同的参数列表。最好的解决方案是什么?

我对OOP也相当陌生,但这段代码有什么问题:

class AWithMixin(A, Mixin):
    def __init__(self, *args):
        A.__init__(self, *args)
        Mixin.__init__(self)
  • A_1构造函数
  • A_2构造函数
  • B构装师

  • 有什么可以阻止您从
    AWithMixin.\uuuu init\uuuu
    调用两个基类的构造函数(使用它们相应的参数)?这已经得到了深入的回答。看,这是最好的解决方案,我总是使用它。但是,如果
    A
    Mixin
    都扩展了某个类(例如
    Base
    ),并且都调用
    Base.\uuuu init\uuuu()
    ,则可以强制使用。这很复杂,我建议你知道,但如果可能的话要避免它。@brandizzi,正如我在回答中所说的,我是OOP新手。我看了看超级函数,但不明白。如果我在这个类上说[code]super(AWithMixin,self)。\uuu init\uuu()[/code],我怎么能调用A.。\uu init\uuu和Mixin.\uu init\uu两者?问题是这个解决方案不是特别可扩展的,它完全忽略了封装点,并且以错误的顺序指定了mixin。如果要重写mixin中的方法,那么该mixin将获得对该方法的控制,并应负责在超类中调用同一方法。mixin接受不同的参数列表这一事实表明它的编码不正确/不是为与这个子类一起使用而设计的——它违反了(1)。
    class A_1(object):
        def __init__(self, *args, **kwargs):
            print 'A_1 constructor'
            super(A_1, self).__init__(*args, **kwargs)
    
    class A_2(object):
        def __init__(self, *args, **kwargs):
            print 'A_2 constructor'
            super(A_2, self).__init__(*args, **kwargs)
    
    class B(A_1, A_2):
        def __init__(self, *args, **kwargs):
            super(B, self).__init__(*args, **kwargs)
            print 'B constructor'
    
    def main():
        b = B()
        return 0
    
    if __name__ == '__main__':
        main()