Утиная печать, миксины и исправление обезьян.

Этот пост является продолжением части I и части II из серии Python: помимо основ. Однако каждая часть стоит сама по себе, так что вы можете начать читать где угодно.

В этом посте мы рассмотрим Duck typing, миксины и исправления monkey.

Утка печатает

Для начала напомним определение утиного теста:

Если он похож на утку, плавает, как утка, и крякает, как утка, то, вероятно, это утка.

Это говорит само за себя, я не могу пояснить.

Но как это связано с питоном? Ответ: Все они животные. Да ладно, давай вернемся к работе, серьезно.

Чтобы не выводить нас из контекста (животных), давайте напишем код о нашем зоопарке. Пока у нас в зоопарке два вида животных: совы и утки:

Наш смотритель Арнольд заботится обо всех наших животных в зоопарке; он кормит их и чистит ежедневно.

Теперь, когда Арнольд пойдет на работу, он будет чистить и кормить всех животных, независимо от их вида. Можно ли его почистить? убери это! можно кормить? покормить его! Мы могли бы даже дать Арнольду резиновую уточку, и он очистит ее и накормит, если у нее есть feed и clean методы.

Это принцип утиного набора текста. Это похоже на полиморфизм в статически типизированных языках, таких как Java, за исключением того, что он проще, гибче и не требует предварительного создания интерфейса (хотя использовать его опаснее. Поставьте машину с животными Арнольда и почувствуйте боль! проблема в том, что вы видите это только при выполнении кода.)

Миксины

Наш смотритель Арнольд оказался садистом. Время от времени Арнольд истязает животных. Чтобы создать реалистичного Арнольда, мы должны дать ему метод пыток животных. У нас уже есть класс Zookeeper, который применяется к большинству зоопарков, мы просто хотим добавить к нему садистский метод .play() только для садистов-зоопарков. Чтобы решить эту проблему, прибегнем к использованию миксинов. Миксины - это классы, которые не существуют сами по себе, но добавляют функциональность другим классам.

Давайте создадим наш садистский миксин и создадим класс SadisticZookeeper, который поможет нам создать Арнольда:

Наш SadisticZookeeper - это класс, унаследованный от Zookeeper и SadisticMixin; По сути, это обычный зоопарк с дополнительной функцией: play.

Но теперь наши животные должны быть мучительными, чтобы Арнольд мог с ними играть. Мы создадим еще один миксин для наших животных: TorturableMixin и создадим наших мучимых животных и нашего садистского арнольда.

Теперь Арнольд может работать как обычно, но он также может получать удовольствие от пыток своих животных, пока его босс отсутствует.

Исправление обезьян

Исправление обезьян, как и утиная печать, - это еще один простой метод с причудливым (?) именем. Патч обезьяны - это метод изменения поведения класса или функции во время выполнения.

Например, как сознательный программист на питоне, который знает исправление обезьян, я могу вывести Арнольда из строя и не дать ему мучить животных, даже если arnold изначально был создан как SadisticZookeeper. Мне просто нужно сделать:

И мы просто залатали обезьяну на Арнольда, чтобы он больше не мог истязать наших животных.

До следующего раза не играй с обезьянами Арнольдом!

ПРИ ИЗГОТОВЛЕНИИ ЭТОЙ СТОЛБЫ НИКАКИМ ЖИВОТНЫМ НЕ ПОТРЕДИЛИ.

つづく