让对象变成可调用对象
正常情况实例只是对象,只能通过.访问属性或方法
在类中定义 __call__ 方法,实例就变成了可调用对象:
class Adder:
def __init__(self, n):
self.n = n
def __call__(self, x):
return self.n + x
add_5 = Adder(5)
print(callable(add_5)) # True
# add_5(10) 等效于 Adder.__call__(add_5, 10)
print(add_5(10)) # 15,像函数一样调用
print(add_5(100)) # 105
关键理解:
__call__让实例可以像函数一样被调用- 调用实例时,传入的参数会传给
__call__方法
实际应用场景
1. 实现可配置的函数对象
class Multiplier:
def __init__(self, factor):
self.factor = factor
def __call__(self, value):
return self.factor * value
double = Multiplier(2)
triple = Multiplier(3)
print(double(5)) # 10
triple(5) # 15
2. 实现状态保持的回调函数
class Logger:
def __init__(self, prefix):
self.prefix = prefix
self.log_count = 0
def __call__(self, message):
self.log_count += 1
print(f"[{self.prefix}] #{self.log_count}: {message}")
error_log = Logger("ERROR")
error_log("文件未找到") # [ERROR] #1: 文件未找到
error_log("网络连接失败") # [ERROR] #2: 网络连接失败
下面代码的输出是什么?为什么?
class A:
def __call__(self):
print("A called")
class B(A):
def __call__(self):
print("B called")
super().__call__()
b = B()
b()
#B called
#A called




