Dalam pengalaman saya, beberapa Pola masih berguna dalam Python, dan bahkan lebih mudah diatur daripada dalam bahasa yang lebih statis. Beberapa Pola OTOH tidak diperlukan, atau bahkan disukai, seperti Pola Singleton. Gunakan variabel tingkat atau fungsi modul sebagai gantinya. Atau gunakan Pola Borg.
Alih-alih menyiapkan Pola Penciptaan itu sering kali cukup untuk melewati callable di sekitar yang menciptakan objek. Itu bisa berupa fungsi, objek dengan __call__
metode atau bahkan kelas, karena tidak ada new()
dalam Python, hanya doa dari kelas itu sendiri:
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)
Pola Negara dan Strategi berbagi struktur yang sangat mirip dalam bahasa seperti C ++ dan Java. Kurang begitu dengan Python. Pola Strategi tetap kurang lebih sama, tetapi Pola Negara menjadi sebagian besar tidak perlu. Pola Negara dalam bahasa statis mensimulasikan perubahan kelas saat runtime. Dengan Python, Anda bisa melakukan hal itu: mengubah kelas objek saat runtime. Selama Anda melakukannya dengan cara yang terkontrol dan dienkapsulasi, Anda akan baik-baik saja:
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
Pola yang bergantung pada Pengiriman Jenis Statis tidak akan berfungsi, atau bekerja dengan sangat berbeda. Anda tidak harus menulis sebanyak kode pelat ketel, misalnya Pola Pengunjung: di Jawa dan C ++ Anda harus menulis metode penerimaan di setiap kelas yang dapat dikunjungi, sedangkan dengan Python Anda dapat mewarisi fungsi itu melalui kelas mixin, seperti Visitable:
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)
Banyak situasi yang membutuhkan penerapan Pola dalam Bahasa Statis yang tidak banyak menggunakan Python. Banyak hal yang dapat diselesaikan dengan teknik lain, seperti fungsi tingkat tinggi (dekorator, pabrik fungsi) atau kelas meta.