Многократное наследование Python / Mixin - PullRequest
6 голосов
/ 19 августа 2011

У меня следующая проблема:

class A:
    animal = 'gerbil'

    def __init__(self):
        self.result = self.calculate_animal()

    def calculate_animal(self):
        print(self.animal)
        return self.animal

class B(A):
    animal = 'zebra'

    def __init__(self):
        super(B, self).__init__()

Теперь я хочу, чтобы определенный набор подклассов из A реализовал новую функцию, которая вычисляет что-то другое для животного, например:

class CapitalizeAnimal:

    def calculate_animal(self):
        self.animal = self.animal.upper()
        # I need to call some version of super().self.animal,
        # but how will this Mixin class know of class A?


class C(A, #CapitalizeAnimal?):
    animal = 'puma':

    def __init__(self):
        super(C, self).__init__()

Как мне заставить class C реализовать CapitalizeAnimal версию calculate_animal, сохранив при этом ее животное как puma?Я запутался в том, как класс Mixin сможет вызывать функцию super ().

Ответы [ 2 ]

5 голосов
/ 19 августа 2011

Порядок родительских классов важен, вы должны сделать это следующим образом:

class C(CapitalizeAnimal, A):
     animal = 'puma'

     def __init__(self):
         super(C, self).__init__()

Дополнительную информацию можно найти, прочитав о MRO (Порядок разрешения методов).


Кроме того, super работает только с новыми классами стилей , поэтому вы должны наследовать A object (если, конечно, вы не используете Python 3).

0 голосов
/ 19 августа 2011

Прежде всего, B и C не нужны __init__(), если единственным действием является вызов супер __init__.

На ваш вопрос: пробовали ли вы class C(A, CapitalizeAnimal): и / или class C(A, CapitalizeAnimal):? То есть, пропуская # и ??

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...