Самоуверенный ответ. Я бы порекомендовал сочинять с использованием базового класса и плагинов. Многократное наследование общих классов может быть очень трудным для отладки.
class AuxPlugin( object):
def auxMethod1( self, ...)
...
class CorePlugin( object)
def coreMethod1( self, ...)
...
class DerPlugin( object)
def derMethod1( self, ...)
...
class AuxOps( AuxPlugin, Main_Fun): # better, call Main_Fun Base_whatever
pass
class CoreOps( CorePlugin, Main_Fun):
pass
class DerOps( DerPlugin, Main_Fun):
pass
class ConFun( AuxPlugin, CorePlugin, DerPlugin, Main_Fun ):
pass
# and possible
# class CoreDerOps( CorePlugin, DerPlugin, Main_Fun):
# pass
# etc. Mix'n'match.
"Правила":
- Плагины всегда наследуются от
object
и ничего не делают, кроме как определяют обычные методы.
- Все плагины идут слева от одного базового класса в классах, наследующих базовый класс
- Плагины должны иметь свой собственный уникальный набор методов, которые не перекрываются с другими совместимыми плагинами (но если они есть, побеждает самый левый плагин)
- Если вы нарушите эти правила, вы пожалеете об этом позже, когда забудете, что сделали, или какой-нибудь другой бедняга проклянет вас и повредит вашу карму.
Вы можете повторить этот паттерн на нескольких уровнях:
class FooFun( FooPlugin, ConFun):
# gets all of ConFun's plug-in methods, its base class, and added FooPlugin's methods
На один уровень ниже допустимо иметь подключенные методы, которые перехватывают и дополняют методы, унаследованные от более низкого уровня, вызывая super().name()
, где это необходимо.
Главное, чтобы выяснить, что относится к тому, что легко. Если он находится в плагине, то не нужно беспокоиться о суперклассе. Любые вызовы super()
относятся к базовому классу или далее к его дереву наследования.