На моєму досвіді, деякі Шаблони все ще корисні в Python і навіть простіші в налаштуванні, ніж у більш статичних мовах. Деякі зразки OTOH просто не потрібні або навіть нахмурені, як, наприклад, шаблон Singleton. Замість цього використовуйте змінну рівня або модуль. Або скористайтеся схемою Борг.
Замість того, щоб створити шаблон творчості, досить часто пропускати дзвінок навколо, який створює об'єкти. Це може бути функція, об'єкт із __call__
методом або навіть класом, оскільки new()
в Python немає , а лише виклик самого класу:
def make_da_thing(maker, other, stuff):
da_thing = maker(other + 1, stuff + 2)
# ... do sth
return da_thing
def maker_func(x, y):
return x * y
class MakerClass(object):
def __init__(self, x, y):
self.x = x
self.y = y
...
a = make_da_thing(maker_func, 5, 8)
b = make_da_thing(MakerClass, 6, 7)
Державний та стратегічний зразок мають дуже схожу структуру в таких мовах, як C ++ та Java. Менше так у Python. Шаблон стратегії залишається більш-менш однаковим, але зразок стану стає здебільшого непотрібним. Шаблон стану в статичних мовах імітує зміну класу під час виконання. У Python ви можете зробити саме це: змінити клас об’єкта під час виконання. Поки ви це робите контрольованим, капсульованим способом, у вас все буде добре:
class On(object):
is_on = True
def switch(self):
self.__class__ = Off
class Off(object):
is_on = False
def switch(self):
self.__class__ = On
...
my_switch = On()
assert my_switch.is_on
my_switch.switch()
assert not my_switch.is_on
Шаблони, що покладаються на диспетчер статичного типу, не працюватимуть, або працюватимуть зовсім інакше. Вам не потрібно писати стільки коду пластини котла, наприклад шаблон шаблону відвідувачів: у Java та C ++ ви повинні написати метод прийняття у кожному видимому класі, тоді як у Python ви можете успадкувати цю функціональність за допомогою класу mixin, наприклад Visible:
class Visitable(object):
def accept(self, visitor):
visit = getattr(visitor, 'visit' + self.__class__.__name__)
return visit(self)
...
class On(Visitable):
''' exactly like above '''
class Off(Visitable):
''' exactly like above '''
class SwitchStatePrinter(object): # Visitor
def visitOn(self, switch):
print 'the switch is on'
def visitOff(self, switch):
print 'the switch is off'
class SwitchAllOff(object): # Visitor
def visitOn(self, switch):
switch.switch()
def visitOff(self, switch):
pass
...
print_state = SwitchStatePrinter()
turn_em_off = SwitchAllOff()
for each in my_switches:
each.accept(print_state)
each.accept(turn_em_off)
У багатьох ситуаціях, які вимагають застосування Шаблону в статичній мові, це не так багато в Python. Багато речей можна вирішити за допомогою інших тем, наприклад, функцій вищого порядку (декоратори, фабрики функцій) або мета-класів.