Trong thư viện có sẵn của
def power[x, n]:
s = 1
while n > 0:
n = n - 1
s = s * x
return s
from functools import partial
power_2 = partial[power, n=2]
power_2[3] # output: 9
power_2[4] # output: 16
6 có một phương thức lấy thuộc tính tên là def power[x, n]:
s = 1
while n > 0:
n = n - 1
s = s * x
return s
from functools import partial
power_2 = partial[power, n=2]
power_2[3] # output: 9
power_2[4] # output: 16
7, thực thi sau khi lấy hàm 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 định nghĩa phương thức thân, 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 ____32 Ví dụ để hiểu cách viết tắt, hãy xem câu lệnh gọi hàm trong Python________số 8
def __init__[self]:
pass def run[self]:
print["Invoking '__call__' method"] __call__ = run
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[]:4
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
def power[x, n]:
s = 1
while n > 0:
n = n - 1
s = s * x
return s
from functools import partial
power_2 = partial[power, n=2]
power_2[3] # output: 9
power_2[4] # output: 16
1Trườ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
def power[x, n]:
s = 1
while n > 0:
n = n - 1
s = s * x
return s
from functools import partial
power_2 = partial[power, n=2]
power_2[3] # output: 9
power_2[4] # output: 16
2Trang trí với đối số
def power[x, n]:
s = 1
while n > 0:
n = n - 1
s = s * x
return s
from functools import partial
power_2 = partial[power, n=2]
power_2[3] # output: 9
power_2[4] # output: 16
3Cá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
def power[x, n]:
s = 1
while n > 0:
n = n - 1
s = s * x
return s
from functools import partial
power_2 = partial[power, n=2]
power_2[3] # output: 9
power_2[4] # output: 16
5sử 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
def power[x, n]:
s = 1
while n > 0:
n = n - 1
s = s * x
return s
from functools import partial
power_2 = partial[power, n=2]
power_2[3] # output: 9
power_2[4] # output: 16
6Và sử dụng nó như thế nào
def power[x, n]:
s = 1
while n > 0:
n = n - 1
s = s * x
return s
from functools import partial
power_2 = partial[power, n=2]
power_2[3] # output: 9
power_2[4] # output: 16
7Kết luậnclass Test[]:6 là 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ó