Phương thức __call__ là một phần của các phương thức tích hợp Python còn được gọi là phương thức dunder hoặc ma thuật vì có hai tiền tố và hậu tố gạch dưới trong tên phương thức. Ý tưởng chính của phương thức __call__ là viết một lớp và gọi nó như một hàm. Bạn có thể gọi nó là đối tượng có thể gọi được
Viết một đối tượng có thể gọi được
class Test[]:
def __init__[self]:
pass def __call__[self]:
print["Invoking '__call__' method"]
Cách phổ biến nhất là xác định thân hàm được thực thi khi một thể hiện được sử dụng làm hàm
Một cách khác để viết nó là
class Test[]:
def __init__[self]:
pass def run[self]:
print["Invoking '__call__' method"] __call__ = run
Ở đây, chúng ta có thể khai báo lời gọi phương thức mà không cần xác định phương thức nội dung, chỉ tham chiếu đến một phương thức khác, trong trường hợp này là phương thức
class Test[]:0
def __init__[self]:
pass def run[self]:
print["Invoking '__call__' method"] __call__ = run
Bạn có thể sử dụng nó theo cách này
test = Test[]
test[]>>> Invoking '__call__' method
Một điều cần lưu ý là bản thân đối tượng được sử dụng như một hàm và tất nhiên, đối tượng có thể được sử dụng như một thể hiện đối tượng bình thường
class Test[]:1 là cách viết tắt của
def __init__[self]:
pass def run[self]:
print["Invoking '__call__' method"] __call__ = run
class Test[]:2 Ví dụ để hiểu cách viết tắt, hãy xem câu lệnh gọi hàm trong Python
def __init__[self]:
pass def run[self]:
print["Invoking '__call__' method"] __call__ = run
def test[]:
print[“function called”] test.__call__[]
Do đó, khi chúng ta sử dụng toán tử
class Test[]:3, chúng ta đang gián tiếp gọi phương thức đặc biệt của
def __init__[self]:
pass def run[self]:
print["Invoking '__call__' method"] __call__ = run
class Test[]:4Cách sử dụng __call__
def __init__[self]:
pass def run[self]:
print["Invoking '__call__' method"] __call__ = run
Để hiểu cách sử dụng hiệu quả các đối tượng được gọi, tôi sẽ đưa ra các ví dụ thực tế về nó. Giữ trong tâm trí của bạn. mục tiêu chính ở đây là sử dụng một thể hiện của lớp như một hàm
Trường hợp 01. hành vi chính của lớp
Một cách phổ biến là xác định hành vi chính của một lớp và sử dụng nó. Trong ví dụ này, chúng tôi sử dụng lớp Cài đặt để lấy giá trị cài đặt theo khóa
import json
from urllib.request import urlopenclass Setting[object]:
def __init__[self, url]:
with urlopen[url] as content:
self.config = json.load[content] def __call__[self, value]:
return self.config[value]settings = Setting["//bit.ly/3ippyXa"]db = settings["db"]
print[db]
Trường hợp 02. trang trí có và không có đối số
Trình trang trí có thể được triển khai với các lớp trong Python, trong trường hợp này, các lớp cần được gọi giống như một hàm
class Test[]:0
def __init__[self]:
pass def run[self]:
print["Invoking '__call__' method"] __call__ = run
Trang trí với đối số
class Test[]:1
def __init__[self]:
pass def run[self]:
print["Invoking '__call__' method"] __call__ = run
Các phương thức mong đợi các phương thức khác
Một cách khác là sử dụng thể hiện của lớp trong các hàm mong đợi một hàm khác trong các tham số, ví dụ: hàm
class Test[]:5 bên dưới
def __init__[self]:
pass def run[self]:
print["Invoking '__call__' method"] __call__ = run
class Test[]:3
def __init__[self]:
pass def run[self]:
print["Invoking '__call__' method"] __call__ = run
sử dụng nâng cao
Một cách sử dụng nâng cao là liên kết lớp thể hiện với các hàm. Trong ví dụ này, tôi đang sử dụng các tham số để xác định hành vi của cá thể và xuất từng cá thể giống như một hàm
class Test[]:4
def __init__[self]:
pass def run[self]:
print["Invoking '__call__' method"] __call__ = run
Và sử dụng nó như thế nào
class Test[]:5Kết luận
def __init__[self]:
pass def run[self]:
print["Invoking '__call__' method"] __call__ = run
class Test[]:6là một hàm đặc biệt trong Python cho phép sử dụng một thể hiện của lớp giống như một hàm
def __init__[self]:
pass def run[self]:
print["Invoking '__call__' method"] __call__ = run
Kiểu triển khai này có thể hơi khó hiểu và thường không phải là giải pháp tốt nhất. Tuy nhiên, tôi thấy một cách tốt để sử dụng nó