这可能是Python特有的,但我认为可以应用于其他语言。
据我的理解(我可能是非常错误的)Mixin是用于合成的,因此每个Mixin不应该依赖于其他Mixin。(除了继承其他mixin的mixin,这是另一个故事)。这个想法是,不管你把他们按什么顺序继承。
如。
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开发人员的建议,在这里创建mixin的最佳实践是什么?