代码之家  ›  专栏  ›  技术社区  ›  James Lin

mixin正在调用super()反模式吗?

  •  -1
  • James Lin  · 技术社区  · 6 年前

    这可能是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的最佳实践是什么?

    0 回复  |  直到 6 年前