mixins是否调用super()反模式?

时间:2019-03-07 22:01:04

标签: python mixins

这可能是特定于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?

0 个答案:

没有答案