Это может быть специфично для Python, но я предполагаю, что может быть применено к другим языкам.
Насколько я понимаю (я могу быть очень неправ) Миксины предназначены для композиции, так что каждый Миксин не должен зависеть от других Миксинов.(кроме миксинов, которые наследуют другие миксины, это другая история).Идея в том, что не имеет значения, в каком порядке наследования вы их размещаете.
Например.
class Device(object):
def turn_on(self):
# some code here...
class AdditionMixin(object):
def add(self, val):
return self.val + val
class SubtractionMixin(object):
def minus(self, val):
return self.val - val
class Calculator(Device, AdditionMixin, SubtractionMixin):
pass
# or
class Calculator(Device, SubtractionMixin, AdditionMixin):
pass
# or
class Calculator(SubtractionMixin, Device, AdditionMixin):
pass
Но если у Mixins есть вызовы super (), то MRO начинает иметь значение, например:
class AutoTurnOffMixin(object):
def turn_on(self):
super(AutoTurnOffMixin, self).turn_on()
...
# set timer and turn off after x seconds
# AutoTurnOffMixin needs to be in front of Device
class Calculator(AutoTurnOffMixin, Device, ...)
И в этом случае мне кажется, что AutoTurnOffMixin
не следуетЯ вообще не могу быть миксином, но стану конкретным классом, который расширяет Device
, например AutoTurnOffDevice
.
Я ищу совет от других разработчиков Python, какова лучшая практика для создания Mixins?