Документация по Python

Классы-примеси (mixin) в Python

В: Документация по Python

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

Однако что если у вас есть функциональность, недоступная базовому классу? Скажем, к примеру, вы хотите , чтобы Car радио и возможность использовать его , чтобы играть песню на радиостанции, с play_song_on_station , но у вас также есть Clock , которые могут использовать радио тоже. Car и Clock могут совместно использовать базовый класс ( Machine ). Однако не все машины могут воспроизводить песни; Boat и Plane не может ( по крайней мере , в данном примере). Так как же добиться успеха без дублирования кода? Вы можете использовать миксин. В Python дать классу mixin так же просто, как добавить его в список подклассов, как это

class Foo(main_super, mixin): ... 

Foo наследует все свойства и методы main_super , но и те из mixin , а также.

Таким образом, чтобы дать классы для Car и Часовой возможность использовать радио, вы можете переопределить Car из предыдущего примера и написать это:

class RadioUserMixin(object):
   def __init__(self):
       self.radio = Radio()

   def play_song_on_station(self, station):
       self.radio.set_station(station)
       self.radio.play_song()

class Car(Vehicle, RadioUserMixin):
   ...

class Clock(Vehicle, RadioUserMixin):
   ... 

Теперь вы можете вызвать car.play_song_on_station(98.7) и clock.play_song_on_station(101.3) , но не что - то вроде boat.play_song_on_station(100.5)

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

Переопределение методов в миксинах

Mixins - это своего рода класс, который используется для «добавления» дополнительных свойств и методов в класс. Это обычно хорошо, потому что много раз классы mixin не переопределяют методы друг друга или базового класса. Но если вы переопределите методы или свойства в своих миксинах, это может привести к неожиданным результатам, потому что в Python иерархия классов определяется справа налево.

Например, возьмите следующие классы

class Mixin1(object):
    def test(self):
        print "Mixin1"

class Mixin2(object):
    def test(self):
        print "Mixin2"

class BaseClass(object):
    def test(self):
        print "Base"

class MyClass(BaseClass, Mixin1, Mixin2):
    pass

 

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

>>> x = MyClass()
>>> x.test()
Base

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

Еще от кодкамп
Замечательно! Вы успешно подписались.
Добро пожаловать обратно! Вы успешно вошли
Вы успешно подписались на кодкамп.
Срок действия вашей ссылки истек.
Ура! Проверьте свою электронную почту на наличие волшебной ссылки для входа.
Успех! Ваша платежная информация обновлена.
Ваша платежная информация не была обновлена.