Миксины, мульти-наследование, конструкторы и данные - PullRequest
6 голосов
/ 09 июня 2011

У меня есть класс:

class A(object):
    def __init__(self, *args):
        # impl

Также "mixin", в основном другой класс с некоторыми данными и методами:

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

    def a_method(self):
        # do something

Теперь я создаю подкласс A сmixin:

class AWithMixin(A, Mixin):
    pass

Моя проблема в том, что я хочу, чтобы оба конструктора A и Mixin вызывались.Я подумал о том, чтобы дать AWithMixin собственный конструктор, в котором вызывался супер, но конструкторы суперклассов имеют разные списки аргументов.Какое лучшее разрешение?

Ответы [ 2 ]

10 голосов
/ 30 ноября 2011
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
9 голосов
/ 09 июня 2011

Я тоже новичок в ООП, но в чем проблема с этим кодом:

class AWithMixin(A, Mixin):
    def __init__(self, *args):
        A.__init__(self, *args)
        Mixin.__init__(self)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...