Рубрики
Без рубрики

Мистины для веселья и прибыли

Этот пост изначально появился на простых, как Python в декабре 2016 года. Есть … Помечено с программированием, софтвордеров, Python, Django.

Этот пост изначально появился на Легко, как Python В декабре 2016 года.

Есть люди, у которых есть время, мотивация и ресурсы, чтобы полностью готовить еду с нуля. Они превратят муку, воду и яйца в пасты и превращают сыр, сливки и специи в соус. Эти люди делают вкусную еду, но это требует времени. Можете ли вы представить, насколько все дольше потребуется, если бы они также превратили в пшеницу, приземлились цыплята и доили сами коровы?

При создании программного обеспечения есть иногда ограничение на глубину, которую мы должны идти. Когда кусочки того, что мы хотели бы достичь, уже были выполнены другими, тем не менее, это имеет много смысла повторно использовать их. Вместо фрезерной пшеницы и поднятия коров мы можем купить муку и лохнувшую говядину. Мы можем начать с нуля, но не царапина царапать.

Один из способов установить на себя успех в объектно-ориентированном программировании, проходит через концепцию, называемую смесином. В Python Mixins поддерживаются через Многократное наследование Отказ Мистины принимают различные формы в зависимости от языка, но в конце дня они инкапсулируют поведение, которое можно повторно использовать в других классах.

Разграничение между использованием истинного наследования и использованием миксейнов нюанс, но сводится к тому, что микн достаточно независим, чтобы он не чувствует себя таким же, как родительский класс. Мистины обычно не используются самостоятельно, но не абстрактные классы тоже.

Предположим, мы написали Mulw of Python Software, и наше приложение готово запустить. Мы собираемся ударить кнопку, когда кто-то приходит и говорит: «Какие вещи мы входе в систему?» О, Боже , думаешь. Мы ничего не регистрируемся! Мы могли бы продолжить и добавить следующую котелную табличку ко всем нашим модулям, чтобы начать работу с ведением:

import logging

class EssentialFunctioner:
    def __init__(self):
        ...

        self.logger = logging.getLogger(
            '.'.join([
                self.__module__,
                self.__class__.__name__
            ])
        )

    def do_the_thing(self):
        try:
            ...
        except BadThing:
            self.logger.error('OH NOES')

Это не так уж плохо, но представьте себе делать это на двадцать или тридцать классов. Не смешно. Как может помочь смешин? Посмотри. Давайте создадим Loggermixin Это делает то же самое, что и выше:

import logging

class LoggerMixin:
    @property
    def logger(self):
        name = '.'.join([
            self.__module__,
            self.__class__.__name__
        ])
        return logging.getLogger(name)

С этим красиво инкапсулированным мы можем теперь пойти, добавив следующее в наш существующий код:

class EssentialFunctioner(LoggerMixin):
    def do_the_thing(self):
        try:
            ...
        except BadThing:
            self.logger.error('OH NOES')

class BusinessLogicer(LoggerMixin):
    def __init__(self):
        self.logger.debug('Giving the logic the business...')

Мы написали функциональность только один раз, но теперь мы можем использовать ее везде! Все, что нам нужно сделать, это наследует от Loggermixin и мы можем продолжить использование self.logger как будто мы установили это в EssentialFuncenter и BusinessLogiciCer Действительно Довольно круто.

Существуют определенные места, где тяжелое использование смесинов может сэкономить тону времени или когнитивной нагрузки. В последнее время в проекте Django необходимо было в проекте Django, где несколько взглядов на основе классом необходимо служить только трафику внутри нашей интрасети. Существующее промежуточное программное обеспечение делает эту проверку, поднимая Http404. Если запрос происходит из-за пределов сети. Добавление того, что функциональные возможности на наши классы были довольно легкими, используя Decorator_from_middleware и method_decorator на взглядах ‘ отправка Методы:

from django.utils.decorators import decorator_from_middleware, method_decorator
from django.views import generic

from app import middleware

network_protected = decorator_from_middleware(
    middleware.NetworkProtectionMiddleware
)

@method_decorator(network_protected, name='dispatch')
class SecretView(generic.View):
    ...

Однако, когда я добавил второй кусок функциональности, я должен был украсить эти взгляды тоже. Я немного устал от украшения.

Счастливых праздников

Вместо этого я изменил интеграцию сети защиты сети в микс, позволяя всем нашим классовым взглядам на наследование от этого, как они увидели:

from django.utils.decorators import decorator_from_middleware, method_decorator
from django.views import generic

network_protected = decorator_from_middleware(
    middleware.NetworkProtectionMiddleware
)

class NetworkProtectionMixin:
    @method_decorator(network_protected)
    def dispatch(self, *args, **kwargs):
        return super().dispatch(*args, **kwargs)

class SecretView(NetworkProtectionMixin, generic.View):
    ...

Аналогичный подход можно использовать для разрешений, аутентификации Django и многое другое. Это мощно, и когда используется правильно, может привести к удивительно выразительному коду. Он также снижает сложность, что позволяет проще пропустить тестирование и понимание единицы.

В конце дня Mixins – это сухой путь к коду архитектора, абстрагируя потенциально сложные функциональные возможности, чтобы разработчики могли сосредоточиться более полно на задаче под рукой вместо того, чтобы примириться за все детали. Радуйся!

Вы использовали микс на практике? Я хотел бы услышать больше.

Вы также можете насладиться моими другими историями о строительстве вещей в Джангу.

Оригинал: “https://dev.to/easyaspython/mixins-for-fun-and-profit-47gc”