Почему бы не дизайн шаблонов питона?

Python

在遥远的Python王国,有一位少年,非常热爱编程,他的父母想给他报一个班,问了万能的朋友圈以后,发现大家都推荐同一个老师,人称吉先生。 

Поэтому его родители без колебаний платили за обучение и отпускали своих детей учиться каждую субботу и воскресенье после обеда. 

Подростки очень усердно учатся и быстро изучают синтаксис, инструменты и фреймворки Python. 

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

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

Он также размещал на своей стене «Дзен Python», часто сравнивая свой код и никогда не осмеливался его нарушить. 

The Zen of Python, by Tim Peters 

Beautiful is better than ugly. 

Explicit is better than implicit. 

Simple is better than complex. 

Complex is better than complicated. 

Flat is better than nested. 

Sparse is better than dense. 

Readability counts. 

......

Три года спустя подросток думал, что стал мастером Python, пока однажды учитель не задал ему большую домашнюю работу, которая на самом деле была большим проектом, а бизнес был очень сложным.

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

Поэтому ему пришлось спросить преподавателя: «Учитель, мои фреймворки Python и Flask уже полностью использованы, почему я не могу завершить этот проект?»

Учитель сказал: «Сын, оказывается, тебе нужно только импортировать классы фреймворка и написать немного кода. Теперь тебе нужно самому проектировать классы и делать абстракции!»

"Как это спроектировать?"

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

Юноша, как клад, проводил бессонные ночи за изучением этой желтоватой древней книги, изданной более 20 лет назад, которая еще была описана на C++. 

Он посмотрел на него как в тумане и, казалось, понял, но, похоже, не понял, поэтому ему пришлось снова спросить учителя. 

На этот раз учитель дал ему другую книгу, "Шаблоны проектирования Head First".

Подросток открыл ее и увидел, что эта книга написана на Java, поэтому снова погрузился в язык Java. 

Эта книга относительно проста для понимания, и подростки захватывают ее, когда читают. 

Наконец, он уверенно с Python начал этот большой проект. 

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

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

Учитель улыбнулся и сказал: «Когда я был в Королевстве Ява, люди всегда говорили: «Динамика крутая, восстановите крематорий», теперь вы это понимаете!»

«Может ли Java избежать этой проблемы?»

«Java — это статический язык. После того, как тип переменной определен, его нельзя изменить. Поддержка рефакторинга очень хорошая. Даббо, Нетти, очень богаты.

Юношеское чувство тоски, поэтому учитель написал ему записку и сказал, когда дело дойдет до королевства Ява, найди И.О. министра, все будет гладко. 

Подросток попрощался с учителем и побежал в Яванскую империю. Учитель поправил ему одежду, посмотрел в сторону восточной Яванской империи и трижды торжественно поклонился: «Прошло пять лет, господин И.О., я прожил на ваше усмотрение, а я одурачил еще одного. Люди едут на Яву!»

Оказывается, учитель Гизон! Миссионеры, посланные министром ИО для распространения культуры и ценностей Явы, были, к сожалению, обнаружены после въезда в страну и помещены под домашний арест в Королевстве Питонов. 

Пожалуйста, перейдите в раздел "История Гисона".Удастся ли проникновение Python империи Ява?

У Python нет интерфейса?

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

Король Пифон был в ярости и приказал провести строгое расследование. После проверки все улики указывают на одного человека: Гизона. 

В этот день специальный посланник Пифон привел воинов в резиденцию Гессена, и тот узнал, что снова дурит юношу. 

Посланник злой засмеялся: «Вы учитесь Python наполовину запеченные, на самом деле осмелились путать людей, это смешно».

Собственная хитрость Гиссена была замечена насквозь, но он все еще очень спокоен: «Ваша честь неправильно понята, я учу подлинным объектно-ориентированным проектам и шаблонам проектирования, ах, этот шаблон проектирования, реализованный в Python, очень неуклюж, я бы порекомендовал им изучить Java ах . "

«Ерунда, как может быть неудобно писать шаблоны проектирования на Python? Java ограничен своей грамматикой, а его выразительные возможности относительно слабы. Для решения некоторых проблем нам приходится использовать неуклюжие шаблоны проектирования для их решения. Мы, Python, можем решить проблему. на уровне грамматики!"

«Тогда скажите мне, каковы принципы шаблонов проектирования?» — спросил Гисон. 

«1. Программируйте интерфейсы, а не реализации. 2. Предпочитайте композицию наследованию».

«Интерфейса Python нет, так как же программировать интерфейс?» — спросил Гисон. 

Спецпредставитель рассмеялся: «Я сказал, что вы неполноценны, но вы все еще не убеждены. Вы думаете, что интерфейс здесь — это ваш Java-интерфейс! Вы забыли Python’s Duck Typing?»

class Duck:    def fly(self):        print("Duck flying")class Airplane:    def fly(self):        print("Airplane flying")def lift_off(entity):    entity.fly()duck = Duck()plane = Airplane()lift_off(duck)lift_off(plane)скопировать код

«Посмотрите, что нет, Duck и AirPlane не реализуют ваш так называемый интерфейс, но вы можете вызвать метод fly(). Разве это не программирование интерфейса, если у вас есть класс, этот fly — автоматизированный интерфейс».

Гисон действительно не ожидал такого уровня.Что касается второго принципа, отдать приоритет использованию композиции вместо наследования, может быть реализовано каждым объектно-ориентированным языком.Он вздохнул и не стал спрашивать. 

Режим адаптера

Далее специальный посланник сказал: «Утиная типизация очень эффективна. Разве вы не упомянули шаблоны проектирования. Перед Duck Typing многие шаблоны проектирования излишни. Позвольте мне привести вам пример — шаблон адаптера. такой кусок кода,Лог можно записать в файл. "

def log(file,msg):    file.write('[{}] - {}'.format(datetime.now(), msg))скопировать код

"Теперь появилось новое требование по записи логов в БД, но в БД нет метода записи, что мне делать? Тогда пиши Адаптер."

class DBAdapter:    def __init__(self, db):        self.db = db    def write(self, msg):        self.db.insert(msg)скопировать код

«Обратите внимание, что этому DBAdapter не нужно реализовывать какой-либо интерфейс (у меня нет интерфейса в Python), это отдельный класс, и ему нужен только метод записи».

db_adapter = DBAdapter(db)log(db_adapter, "sev1 error occurred")скопировать код

Это действительно очень просто, пока есть метод записи, независимо от того, какой у вас объект, вы можете назвать это типичным Duck Typing. 

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

Но недостатком этого метода является то, что его трудно реконструировать, не зная типов параметров логарифмического метода. 

одноэлементный шаблон

Джиссен придумал другой вопрос и продолжил бросать вызов посланнику: «У Python нет даже ключевого слова private, как скрыть конструктор класса и как реализовать синглтон?»

Специальный посланник пренебрежительно сказал: «Забудьте о своем мышлении на Java. Есть много способов написать синглтон на Python. Я покажу вам более питоновский способ реализовать его модульным способом».

#singleton.pyclass Singleton:    def __init__(self):        self.name = "i'm singleton"instance = Singleton()del Singleton  # 把构造函数删除скопировать код

Использование синглтона:

import singletonprint(singleton.instance.name)  # i'm singletoninstance = Singleton() # NameError: name 'Singleton' is not definedскопировать код

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

Режим посетителя

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

Гиссен сказал: «Тогда скажите мне, как вы используете функции Python для посетителей?»

«Я знаю, о чем вы думаете, но вы просто хотите, чтобы я написал класс и написал посетителя для доступа к нему, верно?»

class TreeNode:    def __init__(self, data):        self.data = data        self.left = None        self.right = None    def accept(self, visitor):        if self.left is not None:            self.left.accept(visitor)        visitor.visit(self)        if self.right is not None:            self.right.accept(visitor)class PrintVisitor:    def visit(self,node):        print(node.data)root = TreeNode('1')root.left = TreeNode('2')root.right = TreeNode('3')visitor = PrintVisitor()root.accept(visitor)   #输出2, 1, 3скопировать код

Гиссен сказал: «Да, разве режим посетителя не написан таким образом?»

«Я скажу, что ваш Python — это всего лишь кусочек кожи. Суть Visitor в том, чтобы разделить структуру и работу. Использование генераторов в Python может быть реализовано более элегантно».

class TreeNode:    def __iter__(self):        return self.__generator()    def __generator(self):        if self.left is not None:            yield from iter(self.left)         yield from self.data        if self.right is not None:            yield from iter(self.right) root = TreeNode('1')root.left = TreeNode('2')root.right = TreeNode('3')for ele in root:    print(ele)скопировать код

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

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

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

конец

Королевство Питонов судило Джисена и собиралось приговорить его к смертной казни, но Империя Ява была подавлена ​​и требовала его освобождения, иначе начнется война. 

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

ps Эта история была вдохновлена ​​этим видео: https://www.youtube.com/watch?v=G5OeYHCJuv0

Если вы видите это внимательно, это означает, что вы являетесь стойким сторонником Code Farmer Turnover и отправили 5 копий «Head First Design Patterns», подписанную версию + эксклюзивную печать Code Farmer Turnover (еще раз спасибо читателю @Aries за тяжелая работа).

Книг всего пять, и только по счастливой случайности ответьте на сообщение «лотерея в режиме дизайна» в паблик-аккаунте, и вы сможете участвовать в лотерее.