Đây là một ý tưởng tuyệt vời cho các API nơi bạn đang xây dựng trạng thái thông qua các phương pháp. SQLAlchemy sử dụng này để hiệu ứng tuyệt vời cho ví dụ:
>>> from sqlalchemy.orm import aliased
>>> adalias1 = aliased(Address)
>>> adalias2 = aliased(Address)
>>> for username, email1, email2 in \
... session.query(User.name, adalias1.email_address, adalias2.email_address).\
... join(adalias1, User.addresses).\
... join(adalias2, User.addresses).\
... filter(adalias1.email_address=='[email protected]').\
... filter(adalias2.email_address=='[email protected]'):
... print(username, email1, email2)
Lưu ý rằng nó không trả lại self
trong nhiều trường hợp; nó sẽ trả về một bản sao của đối tượng hiện tại với một khía cạnh nhất định bị thay đổi. Bằng cách này, bạn có thể tạo các chuỗi phân kỳ dựa trên cơ sở dùng chung; base = instance.method1().method2()
, sau đó foo = base.method3()
và bar = base.method4()
.
Trong ví dụ trên, đối tượng Query
được trả về bởi cuộc gọi Query.join()
hoặc Query.filter()
không phải là cùng một ví dụ, nhưng một phiên bản mới có bộ lọc hoặc tham gia được áp dụng cho nó.
Sử dụng Generative
base class để xây dựng; nên thay vì return self
, mô hình sử dụng là:
def method(self):
clone = self._generate()
clone.foo = 'bar'
return clone
mà SQLAlchemy tiếp tục đơn giản hóa bằng cách sử dụng a decorator:
def _generative(func):
@wraps(func)
def decorator(self, *args, **kw):
new_self = self._generate()
func(new_self, *args, **kw)
return new_self
return decorator
class FooBar(GenerativeBase):
@_generative
def method(self):
self.foo = 'bar'
Tất cả các phương pháp @_generative
-decorated đã làm là làm cho những thay đổi trên bản sao, các trang trí sẽ chăm sóc sản xuất bản sao, ràng buộc phương pháp vào bản sao thay vì bản gốc và trả lại cho người gọi cho bạn.
Xem http://programmers.stackexchange.com/questions/29657/purpose-of-return-self-from-a-class-method – ilim
kỹ thuật này được gọi là giao diện thông thạo. xem: https://en.wikipedia.org/wiki/Fluent_interface – Alex
Câu hỏi về các phương pháp hay nhất phù hợp với Stack Overflow? Nó có vẻ phù hợp hơn với các lập trình viên hoặc Code Review. Tôi có khuynh hướng nói "đây là một kỹ thuật tốt hay xấu" quá rộng ở đây. –