这可能是特定于Python的,但我想可以应用于其他语言。
据我所知(我可能是非常错误的),混入是出于合成目的,因此每个混入都不应依赖其他混入。 (除了继承其他Mixins的Mixins,这是另外一个故事)。想法是,将继承放在哪个顺序都没有关系。
例如。
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?