내 경험상 일부 패턴은 여전히 파이썬에서 유용하며 정적 언어보다 설정하기가 훨씬 쉽습니다. 일부 패턴 OTOH는 싱글 톤 패턴처럼 필요하지 않거나 찡그린 얼굴 일뿐입니다. 대신 모듈 레벨 변수 또는 함수를 사용하십시오. 또는 보그 패턴을 사용하십시오.
생성 패턴을 설정하는 대신 객체를 생성하는 호출 가능 객체를 전달하는 것으로 충분합니다. 파이썬에는 클래스 자체의 호출 __call__
이 없기 때문에 함수, 메소드 또는 클래스가 있는 객체 일 수 있습니다 new()
.
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와 같은 언어에서 매우 유사한 구조를 공유합니다. 파이썬에서는 그렇지 않다. 전략 패턴은 다소 동일하지만 상태 패턴은 대부분 불필요합니다. 정적 언어의 상태 패턴은 런타임시 클래스 변경을 시뮬레이션합니다. 파이썬에서는 다음과 같이 할 수 있습니다 : 런타임에 객체의 클래스를 변경하십시오. 통제되고 캡슐화 된 방식으로 수행하는 한 괜찮습니다.
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에서는 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)
정적 언어에서 패턴의 적용을 요구하는 많은 상황은 파이썬에서 그렇게 많이하지 않습니다. 고차 함수 (데코레이터, 함수 팩토리) 또는 메타 클래스와 같은 다른 기법으로 많은 것을 해결할 수 있습니다.