Вызывает ли миксин супер () анти-паттерн? - PullRequest
1 голос
/ 08 марта 2019

Это может быть специфично для 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?

...