【问题标题】:Mixins, multi-inheritance, constructors, and dataMixins、多继承、构造函数和数据
【发布时间】:2011-09-11 19:10:30
【问题描述】:

我有一堂课:

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,但是超类的构造函数有不同的参数列表。最佳分辨率是多少?

【问题讨论】:

  • 是什么阻止您从AWithMixin.__init__ 调用这两个基类的构造函数(及其适当的参数)?
  • 这已经得到了深入的回答。见stackoverflow.com/a/6100595/763269

标签: python multiple-inheritance mixins


【解决方案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()
  1. A_1 构造函数
  2. A_2 构造函数
  3. B 构造函数

【讨论】:

    【解决方案2】:

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

    class AWithMixin(A, Mixin):
        def __init__(self, *args):
            A.__init__(self, *args)
            Mixin.__init__(self)
    

    【讨论】:

    • 这是最好的解决方案,我总是使用它。但是,如果AMixin 都扩展了某个类(例如Base)并且都调用Base.__init__(),则可以强制使用super() function。恕我直言,这很复杂,我建议您了解但尽可能避免。
    • @brandizzi,正如我在回答中所说,我是 OOP 的新手。我看了超级功能,但不明白。如果我在这个类上说 [code]super(AWithMixin, self).__init__()[/code],我怎么能同时调用 A.__init__ 和 Mixin.__init__ 呢?并指定不同的参数?
    • 问题是这个方案不是特别可扩展,而且完全忽略了封装的点,而且指定mixin的顺序错误。如果您想覆盖 mixin 中的方法,则该 mixin 可以控制该方法,并且应该负责在超类中调用相同的方法。 mixin 采用不同的参数列表这一事实表明它的编码不正确/并非设计用于此子类——它违反了LSP)。
    猜你喜欢
    • 2011-07-06
    • 2014-11-22
    • 2016-03-24
    • 2011-12-27
    • 1970-01-01
    • 2017-11-17
    • 2020-08-07
    • 2012-09-03
    相关资源
    最近更新 更多