Nói rằng tôi đã xây dựng một thư viện chứa một lớp Foo
, với sự hỗ trợ đối với một số phương pháp kỳ diệu, nói __add__()
và __radd__()
:Có phương pháp tốt nhất cho các phương pháp ma thuật mở rộng trong python?
>>> class Foo(object):
... def __add__(self, rhs):
... print("Foo.__add__", rhs)
... def __radd__(self, lhs):
... print("Foo.__radd__", lhs)
...
>>> foo = Foo()
>>> foo + 3
Foo.__add__ 3
>>> 3 + foo
Foo.__radd__ 3
Khi tính toán 3 + foo
, trăn đầu tiên gọi type(3).__add__(3, foo)
, nhưng như thế này trả về NotImplemented
, nó rơi trở lại để type(foo).__radd__(foo, 3)
:
>>> type(3).__add__(3, foo)
NotImplemented
tôi muốn các nhà phát triển có thể xây dựng các thư viện trên đầu trang của thư viện của tôi, nói một thư viện chứa một lớp Bar
và tôi muốn họ có toàn quyền kiểm soát. Cụ thể, tôi muốn triển khai một số cơ chế cho phép thư viện khác quyết định xem foo + bar
có nên gọi số foo.__add__(bar)
hoặc bar.__radd__(foo)
hay không.
Tôi thấy rằng NumPy đã giải quyết vấn đề này bằng cách sử dụng sơ đồ __array_priority__
. Nhưng điều này dường như gây ra một số nhức đầu (xem xét số lượng câu hỏi và các vấn đề mở ra về điều này). Có các phương pháp hay nhất khác không?
Bạn có muốn tính năng này hoạt động với các lớp hiện có không? –
Mặc dù câu hỏi của bạn khá thú vị nhưng thiếu chi tiết. Bạn có thể descrbe nhiều khía cạnh của hành vi mong muốn? –