mixin python что это

Что такое миксины в Python и как их использовать.

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

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

Пример множественного наследования.

Пример использования класса миксина/примеси.

В отличие от приведенного выше примера, класс миксина не предназначен для использования отдельно. Он предоставляет новые методы или переопределяет имеющиеся методы.

Например, в стандартной библиотеке Python, в модуле socketserver есть несколько миксинов. Выдержка из документации:

С помощью этих классов миксинов могут быть созданы поточные версии каждого типа сервера. Например, ThreadingUDPServer создается следующим образом:

Простой пример для понимания поведения классов миксинов.

Иногда молодые программисты не до конца понимают принцип MRO в Python и по этому в некоторых случаях не правильно используют классы миксинов.

Источник

Введение в Python

Поиск

Новое на сайте

Множественное наследование в Python

Язык программирования Python являясь языком, поддерживающим парадигму объектно-ориентированного программирования (ООП), также поддерживает и возможность множественного наследования. То есть, возможность у класса потомка наследовать функционал не от одного, а от нескольких родителей. Благодаря этому мы можем создавать сложные структуры, сохраняя простой и легко-поддерживаемый код.
Например, у нас есть класс автомобиля:

Так же у нас есть класс для лодки:

Теперь, если нам нужно запрограммировать автомобиль-амфибию, который будет плавать в воде и ездить по земле, мы вместо написания нового класса, можем просто унаследовать от уже существующих:

Теперь мы можем создать инстанс класса Amphibian, который будет уметь и плавать и ездить.

Обратите внимание, что инстанс класса Amphibian, будет одновременно инстансом класса Auto и Boat, то есть:

Примеси (Mixins) в Python

Использование множественного наследования, позволяет нам создавать, так называемые, классы-примеси или миксины. Представим, что мы программируем класс для автомобиля. Мы хотим, чтобы у нас была возможность слушать музыку в машине. Конечно, можно просто добавить метод play_music() в класс Car:

Но что если, у нас есть еще и телефон, радио или любой другой девайс, с которого мы будем слушать музыку. В таком случае, лучше вынести функционал проигрывания музыки в отдельный класс-миксин:

Мы можем «домешивать» этот класс в любой, где нужна функция проигрывания музыки:

Порядок разрешения методов (Method Resolution Order / MRO) в Python. Ромбовидное наследование (The Diamond Problem)

Итак, классы-наследники могут использовать родительские методы. Но что, если у нескольких родителей будут одинаковые методы? Какой метод в таком случае будет использовать наследник? Рассмотрим классический пример:

Если вам необходимо использовать метод конкретного родителя, например hi() класса С, нужно напрямую вызвать его по имени класса, передав self в качестве аргумента:

Источник

Русские Блоги

Понимание концепций Mixin через Python

Концепция Миксин

Используя множественное наследование Python, подклассы могут наследовать классы Mixin различных функций и динамически объединять их по мере необходимости.

Когда несколько классов реализовали одну и ту же функцию, эту функцию следует рассматривать как класс Mixin.

например

Определите простой класс:

Мы можем получить к нему доступ, вызвав свойства экземпляра:

Затем мы определяем класс Mixin:

Этот класс позволяет подклассам иметь возможность вызывать такие атрибуты, как dict

Мы добавляем этот Mixin в класс Person:

Теперь у Person есть еще один способ вызова атрибутов:

Затем определите класс Mixin, этот класс реализует __repr__ Метод, может автоматически объединять атрибуты и значения в строку:

Используя возможности Python, класс может наследовать несколько родительских классов:

Этот подкласс смешивает две функции:

подводить итоги

Mixin по существу использует языковые функции и может рассматриваться как особый вид множественного наследования, поэтому он не является эксклюзивным для Python, если он поддерживает множественное наследование или аналогичные функции, такие как синтаксис include в Ruby, Vue и других интерфейсных полях. Существует также концепция Mixin.

Тем не менее, Mixin не относится к грамматике языка.Для удобства чтения и поддержки кода, определение и использование класса Mixin должны следовать нескольким принципам:

1. Функции, реализуемые Mixin, должны быть универсальными и единичными. Например, два класса Mixin в приведенном выше примере подходят для большинства подклассов. Каждый Mixin реализует только одну функцию и может наследоваться при необходимости. 2. Mixin используется только для расширения функций подклассов, он не может влиять на основные функции подклассов, и подклассы не могут полагаться на Mixin. Например, в приведенном выше примере Person ¡Наследование разных миксов просто добавляет некоторые функции и не влияет на его основные функции. Если это зависимость, то это реальный базовый класс, и его не следует называть в честь Mixin. 3. Сам класс Mixin не может быть создан, он используется только для наследования подклассами.

Читайте также:  что такое глушилки для телефонов

Рекомендуемое чтение

Сканирование кода ответа: анализ данных

Получите 38g учебные ресурсы по анализу данных

Как статья, заказ смотреть в

Источник

Что такое миксин и почему они полезны?

В «программировании Python» Марк Лутц упоминает «миксины». Я из C / C ++ / C # фона, и я не слышал этот термин раньше. Что такое миксин?

Чтение между строками этот пример (с которым я связался, потому что он довольно длинный), я предполагаю, что это случай использования множественного наследования для расширения класса в отличие от «правильного» подкласса. Это правильно?

Почему я хотел бы сделать это, а не помещать новую функциональность в подкласс? В этом отношении, почему подход смешанного / множественного наследования лучше, чем использование композиции?

Что отличает миксин от множественного наследования? Это просто вопрос семантики?

14 ответов

Для примера номер один рассмотрим систему запросов и ответов werkzeug. Я могу сделать простой старый объект запроса, сказав:

Если я хочу добавить поддержку заголовка принять, я бы сделал это

Если бы я хотел создать объект запроса, который поддерживает заголовки принятия, etags, аутентификацию и поддержку агента пользователя, я мог бы сделать это:

Во-первых, вы должны заметить, что миксины существуют только в языках множественного наследования. Вы не можете сделать миксин в Java или C #.

Миксины обычно узкие по объему и не предназначены для расширения.

Что отличает миксин от множественного наследования? Это просто вопрос семантики?

Да. Разница между миксином и стандартным множественным наследованием является лишь вопросом семантики; класс с множественным наследованием может использовать миксин как часть этого множественного наследования.

Смысл mixin состоит в том, чтобы создать тип, который можно «смешать» с любым другим типом посредством наследования, не затрагивая наследующий тип, и в то же время предлагать некоторые полезные функции для этого типа.

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

Другим важным моментом в этом примере является то, что вы хотите сделать это в общем виде. Вам не нужно реализовывать методы «ToXML» и «FromXML» для каждого типа, который вы хотите сериализовать, вам нужны некоторые общие средства, гарантирующие, что ваш тип будет делать это, и он просто работает. Вы хотите повторного использования кода.

Если ваш язык поддерживает это, вы можете создать миксин XmlSerializable, который сделает вашу работу за вас. Этот тип будет реализовывать методы ToXML и FromXML. Используя некоторый механизм, который не важен для примера, он мог бы собрать все необходимые данные из любого типа, с которым он смешан, для создания фрагмента XML, возвращаемого ToXML, и он был бы в равной степени способен восстанавливать эти данные, когда FromXML называется.

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

Теперь представьте, что вы можете использовать этот сценарий для других целей, например, для создания миксина, который гарантирует, что каждый класс, который смешивает его, регистрирует каждый вызов метода, или миксина, который обеспечивает транзакционность для типа, который его смешивает. Список можно продолжать и продолжать.

Если вы просто думаете о миксине как о небольшом базовом типе, предназначенном для добавления небольшого количества функциональности к типу, без какого-либо влияния на этот тип, то вы просто великолепны.

Мое понимание соглашений, которые управляют чем-то, что вы бы назвали миксином, таково, что миксин:

Таким образом, он ограничивает потенциальную сложность множественного наследования и позволяет достаточно легко отслеживать поток вашей программы, ограничивая область поиска (по сравнению с полным множественным наследованием). Они похожи на рубиновые модули.

Если я хочу добавить переменные экземпляра (с большей гибкостью, чем допускается одиночным наследованием), я склоняюсь к компоновке.

Сказав это, я видел классы с именем XYZMixin, которые имеют переменные экземпляра.

Что отличает миксин от множественного наследования? Это просто вопрос семантики?

Пример множественного наследования

Этот пример, из документации, является OrderedCounter :

Это мощный способ повторного использования кода, но он также может быть проблематичным. Если окажется, что в одном из объектов есть ошибка, ее исправление может привести к ошибке в подклассе.

Читайте также:  какой налог на дом 300 м2

Пример миксина

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

В отличие от приведенного выше примера, миксин не предназначен для самостоятельного использования. Это обеспечивает новую или другую функциональность.

Например, в стандартной библиотеке есть несколько смесей в socketserver библиотека.

Версии Forking и Threading для каждого типа сервера могут быть созданы с помощью этих смешанных классов. Например, ThreadingUDPServer создается следующим образом:

Первым является смешанный класс, поскольку он переопределяет метод, определенный в UDPServer. Установка различных атрибутов также изменяет поведение базового серверного механизма.

Надуманный пример

И использование будет:

Я думаю, что здесь было несколько хороших объяснений, но я хотел представить другую точку зрения.

В Scala вы можете создавать миксины, как описано здесь, но что очень интересно, это то, что миксины фактически «слиты» вместе, чтобы создать новый тип класса для наследования. По сути, вы не наследуете от нескольких классов / миксинов, а генерируете новый тип классов со всеми свойствами миксина, от которых наследуются. Это имеет смысл, поскольку Scala основан на JVM, где множественное наследование в настоящее время не поддерживается (начиная с Java 8). Этот тип класса mixin, кстати, является специальным типом, называемым Trait в Scala.

Существуют способы заставить MRO с множественным наследованием работать в Python, в частности, функцию super (), но это означает, что вы должны выполнить всю иерархию классов, используя super (), и понять процесс управления значительно сложнее.

Возможно, пара примеров поможет.

Второй пример: инструментарий GUI wxPython позволяет создавать элементы управления списком с несколькими столбцами (как, например, отображение файла в проводнике Windows). По умолчанию эти списки являются довольно простыми. Вы можете добавить дополнительные функции, такие как возможность сортировки списка по определенному столбцу, щелкнув заголовок столбца, наследуя от ListCtrl и добавив соответствующие миксины.

Это не пример Python, но в языке программирования D используется термин mixin используется для ссылки на конструкцию, используемую почти таким же образом ; добавив кучу вещей в класс.

В D (который, кстати, не делает MI), это делается путем вставки шаблона (подумайте о синтаксически осведомленных и безопасных макросах, и вы будете близки) в область действия. Это позволяет использовать одну строку кода в классе, структуре, функции, модуле или любом другом объекте для расширения до любого количества объявлений.

Может быть, пример из ruby может помочь:

Это делается путем вызова (other) и возврата правильного результата.

Mixin дает возможность добавить функциональность в класс, т. е. вы можете взаимодействовать с методами, определенными в модуле, включив модуль в нужный класс. Хотя ruby не поддерживает множественное наследование, но предоставляет mixin как альтернативу для достижения этой цели.

Вот пример, который объясняет, как множественное наследование достигается с помощью mixin.

OP упомянул, что он / она никогда не слышал о mixin в C ++, возможно, это потому, что они называются Curily Recurring Template Pattern (CRTP) в C ++. Также @Ciro Santilli отметил, что mixin реализован через абстрактный базовый класс в C ++. В то время как абстрактный базовый класс может использоваться для реализации mixin, это является излишним, поскольку функциональность виртуальной функции во время выполнения может быть достигнута с использованием шаблона во время компиляции без накладных расходов на поиск виртуальной таблицы во время выполнения.

Шаблон CRTP подробно описан здесь.

Я преобразовал пример python в ответе @Ciro Santilli в C ++, используя шаблонный класс ниже:

РЕДАКТИРОВАТЬ: Добавлен защищенный конструктор в ComparableMixin, так что он может быть только унаследован и не создан. Обновлен пример, чтобы показать, как защищенный конструктор вызовет ошибку компиляции при создании объекта ComparableMixin.

Я просто использовал Python Mixin для реализации модульного тестирования Python Milters. Как правило, milter разговаривает с MTA, что затрудняет юнит-тестирование. Тестовый миксин переопределяет методы, которые общаются с MTA, и вместо этого создает моделируемую среду, управляемую тестовыми примерами.

Итак, вы берете немодифицированное приложение milter, такое как spfmilter, и mixin TestBase, например:

Затем используйте TestMilter в тестовых случаях для приложения milter:

Источник

В чем разница между классами mixin и стандартным множественным наследованием в python [duplicate]

(Это было упомянуто выше в том же сообщении кем-то, спасибо за это.)

15 ответов

Если я хочу добавить поддержку заголовка accept, я бы сделал это

Если бы я хотел сделать запрашивать объект, поддерживающий прием заголовков, etags, проверку подлинности и поддержку пользовательского агента, я мог бы это сделать:

Читайте также:  что делать если забыл вещи в отеле

Что отличает mixin от множественного наследования? Это только вопрос семантики?

В контексте Python, особенно, mixin является родительским классом, который предоставляет функциональные возможности для подклассы, но не предназначены для создания самого себя.

Пример множественного наследования

Оба Counter и OrderedDict предназначены для создания и использования самостоятельно. Однако, подклассифицируя их оба, мы можем иметь счетчик, который упорядочен и повторно использует код в каждом объекте.

Это мощный способ повторного использования кода, но также может быть проблематичным. Если окажется, что в одном из объектов есть ошибка, исправление без забот может создать ошибку в подклассе.

Пример Mixin

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

В отличие от вышеприведенного примера, mixin не предназначен для использования сам по себе. Он предоставляет новую или различную функциональность.

Forking и потоковые версии каждого типа сервера могут быть созданы с использованием этих классов смешения. Например, ThreadingUDPServer создается следующим образом:

Класс mix-in приходит первым, поскольку он переопределяет метод, определенный в UDPServer. Установка различных атрибутов также изменяет поведение базового механизма сервера.

Проприведенный пример

и использование будет:

Это не пример Python, но в языке программирования D термин mixin используется для ссылки на конструкцию, используемую почти одинаково; добавив кучу вещей в класс.

В D (который, кстати, не делает MI) это делается путем вставки шаблона (думаю, что синтаксически осведомленные и безопасные макросы и вы будете близки) в область. Это позволяет использовать одну строку кода в классе, структуре, функции, модуле или любом другом, чтобы расширять любое количество объявлений.

OP упомянул, что он никогда не слышал о mixin в C ++, возможно, это потому, что они называются Curiously Recurring Template Pattern (CRTP) в C ++. Кроме того, @Ciro Santilli упомянул, что mixin реализован через абстрактный базовый класс в C ++. В то время как абстрактный базовый класс может использоваться для реализации mixin, он является чрезмерным, поскольку функциональность виртуальной функции во время выполнения может быть достигнута с использованием шаблона во время компиляции без накладных расходов на поиск виртуальной таблицы во время выполнения.

Схема CRTP подробно описана здесь здесь

Я преобразовал пример python в ответ @Ciro Santilli на C ++, используя шаблонный класс ниже:

Я бы посоветовал не смешивать в новый код Python, если вы можете найти какой-либо другой способ для него (например, композиция вместо наследования или просто методы клонирования обезьян в свои собственные классы)

Существуют способы сделать работу MRO с множественным наследованием в Python, особенно в функции super (), но это означает, что вы должны выполнять всю свою иерархию классов с помощью функции super (), и значительно сложнее понять поток управления.

Этот ответ направлен на объяснение mixins примерами, которые:

It также должен рассмотреть спорный вопрос:

Требуется ли множественное наследование или не охарактеризовать mixin?

У меня еще нет чтобы увидеть цитату из «авторитетного» источника, четко говорящего о том, что такое mixin в Python.

Я видел 2 возможных определения mixin (если их следует рассматривать как отличающиеся от других подобных понятий, таких как абстрактные базовые классы), и люди не полностью согласны с тем, какой из них правильный.

Консенсус может различаться между разными языками.

Определение 1: отсутствие множественного наследования

Поэтому класс не предназначен для создания экземпляра, а скорее s как основной класс. В противном случае экземпляр имел бы методы, которые нельзя вызвать без привлечения исключения.

Классическим примером является реализация всех операторов сравнения только из и == :

Определение 2: множественное наследование

Термин mixin class относится к базовым классам, которые предназначены для использования в этом шаблоне проектирования (TODO те, которые используют этот метод, или те которые его реализуют?)

Нелегко решить, является ли данный класс микшированием или нет: метод может быть просто реализован в производном классе, и в этом случае мы вернемся к определению 1. Вы должны рассмотреть t авторские намерения.

Этот шаблон интересен тем, что можно рекомбинировать функциональные возможности с различными вариантами базовых классов:

Авторитетные вхождения Python

В нем указано, что если класс:

, тогда класс получает метод __iter__ mixin бесплатно.

Поэтому, по крайней мере, в этой точке документации, mixin не требует множественного наследования и согласуется с определением 1.

Документация может быть, конечно, противоречивой в разных точках, а другие важные библиотеки Python могут использовать другое определение в своей документации.

Источник

Сказочный портал