Theo kinh nghiệm của tôi, một số Mẫu vẫn hữu ích trong Python và thậm chí dễ cài đặt hơn so với các ngôn ngữ tĩnh hơn. Một số Mẫu OTOH không cần thiết, hoặc thậm chí không tán thành, như Mẫu đơn. Sử dụng một biến cấp mô-đun hoặc chức năng thay thế. Hoặc sử dụng Mô hình Borg.
Thay vì thiết lập một Mô hình sáng tạo, nó thường đủ để vượt qua một cuộc gọi xung quanh tạo ra các đối tượng. Đó có thể là một hàm, một đối tượng với một __call__
phương thức hoặc thậm chí là một lớp, vì không có new()
trong Python, chỉ là một lời gọi của chính lớp đó:
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)
Mẫu trạng thái và chiến lược chia sẻ một cấu trúc rất giống nhau trong các ngôn ngữ như C ++ và Java. Ít hơn trong Python. Mẫu chiến lược giữ nguyên ít nhiều giống nhau, nhưng Mẫu trạng thái hầu như không cần thiết. Mẫu trạng thái trong các ngôn ngữ tĩnh mô phỏng sự thay đổi của lớp khi chạy. Trong Python, bạn có thể làm điều đó: thay đổi lớp của một đối tượng khi chạy. Miễn là bạn làm điều đó theo cách được kiểm soát, đóng gói, bạn sẽ ổn:
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
Các mẫu dựa trên Công cụ loại tĩnh sẽ không hoạt động hoặc hoạt động hoàn toàn khác. Bạn không phải viết nhiều mã tấm nồi hơi, ví dụ Mẫu khách truy cập: trong Java và C ++, bạn phải viết một phương thức chấp nhận trong mọi lớp có thể truy cập, trong khi trong Python, bạn có thể kế thừa chức năng đó thông qua lớp mixin, như 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)
Nhiều tình huống yêu cầu ứng dụng Mẫu trong Ngôn ngữ tĩnh không thực hiện nhiều bằng Python. Nhiều thứ có thể được giải quyết với các kỹ thuật khác, như các hàm bậc cao hơn (trang trí, nhà máy chức năng) hoặc các lớp meta.