以我的经验,某些模式在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
依赖于静态类型分派的模式将无法工作,或者工作方式会完全不同。您不必编写过多的样板代码,例如,Visitor Pattern:在Java和C ++中,您必须在每个可访问类中编写一个accept方法,而在Python中,您可以通过mixin类继承该功能,例如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)
在Python中,许多要求以静态语言应用模式的情况并没有那么多。许多其他问题也可以解决,例如高阶函数(装饰器,函数工厂)或元类。