Многоуровневое наследование Python / Mixin

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

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 Solutions collect form web for “Многоуровневое наследование Python / Mixin”

Порядок родительских классов важен, вы должны сделать это так:

 class C(CapitalizeAnimal, A): animal = 'puma' def __init__(self): super(C, self).__init__() 

Более подробную информацию можно найти, прочитав о MRO (Order Resolution Method).


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

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

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

  • Python: Правильный способ инициализации, когда суперклассы принимают разные аргументы?
  • Вызов родительского класса __init__ с множественным наследованием, каков правильный путь?
  • Множественное наследование с теми же базовыми классами в Python
  • Python - лучший язык программирования в мире.