Deneyimlerime göre, bazı Desenler Python'da hala yararlıdır ve kurulumu daha statik dillerden daha kolaydır. Bazı OTON Desenleri, Singleton Paterni gibi gerekli değildir, hatta kaşlarını çatmaz. Bunun yerine modül düzeyinde bir değişken veya işlev kullanın. Veya Borg Desenini kullanın.
Bir Yaratılış Deseni ayarlamak yerine, genellikle nesnelerin yaratıldığı bir çağrıyı geçirmek yeterlidir. Bu bir işlev, __call__
yöntemli bir nesne veya hatta bir sınıf olabilir, çünkü new()
Python'da sadece sınıfın bir çağrılması yoktur :
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)
Durum ve Strateji Paterni, C ++ ve Java gibi dillerde çok benzer bir yapıyı paylaşır. Python'da daha az. Strateji Kalıbı aşağı yukarı aynı kalır, ancak Devlet Kalıbı çoğunlukla gereksiz hale gelir. Statik dillerdeki Durum Düzeni, çalışma zamanında sınıf değişikliğini simüle eder. Python'da şunları yapabilirsiniz: çalışma zamanında bir nesnenin sınıfını değiştirme. Kontrollü, kapsüllenmiş bir şekilde yaptığınız sürece, iyi olmalısınız:
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
Statik Tip Sevk'ye dayanan desenler çalışmaz veya farklı çalışır. Çok fazla kazan plakası kodu yazmak zorunda değilsiniz, örneğin Ziyaretçi Deseni: Java ve C ++ 'da her ziyaret edilebilir sınıfta bir kabul yöntemi yazmanız gerekirken, Python'da bu işlevselliği Visitable gibi bir mixin sınıfı aracılığıyla devralabilirsiniz.
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)
Bir Desenin Statik Dilde uygulanmasını gerektiren birçok durum Python'da böyle bir şey yapmaz. Birçok şey, daha üst düzey işlevler (dekoratörler, işlev fabrikaları) veya meta sınıfları gibi diğer tekniklerle çözülebilir.