概述
-
作用
- 让「类的实例对象」可以像函数一样,直接加
()调用
- 让「类的实例对象」可以像函数一样,直接加
-
语法
python# 类中 def __call__(): pass
实际应用场景
装饰器类
python
import time
class Timer:
def __init__(self):
pass
def __call__(self, func):
# 装饰器 计算耗时
def wrapper(*args, **kwargs):
start = time.perf_counter()
func_res = func(*args, **kwargs)
end = time.perf_counter()
print(f'计算时间:{(end - start):.2f}')
return func_res
return wrapper
# 两种使用方式
# 方式一:
# t1 = Timer()
# @t1
# def get_sum(*args, **kwargs):
# time.sleep(1)
# return sum(args) + sum(kwargs.values())
# 方式二:
@Timer()
def get_sum(*args, **kwargs):
time.sleep(1)
return sum(args) + sum(kwargs.values())
res = get_sum(10,20,30, a=1, b=2, c=3)
print(res)
框架可调用算子(模仿 PyTorch 模型机制,
__call__标准用法)
python
class Net:
def __init__(self):
self.w = 2.0
# 正向传播
def forward(self, x):
return self.w * x
# 入口:model(x) 触发
def __call__(self, x):
print('【框架内部】执行预处理、钩子操作')
out = self.forward(x)
print('输出结果', out)
print('【框架内部】执行后处理')
return out
model = Net() # 实例化
result = model(3) # 调用__call__魔法方法
框架回调类(可调用回调对象)
python
class TrainCallback:
def __init__(self, model_name):
self.model_name = model_name
# epoch 训练轮数 loss 损失函数
def __call__(self, epoch, loss):
print(f'【回调通知】{self.model_name} Epoch:{epoch} 当前损失:{loss:.3f}')
# 模拟训练框架
def train(callback):
for epoch in range(3):
loss = 1.0 / (epoch + 1)
callback(epoch, loss)
# 创建回调实例传入训练函数
my_callback = TrainCallback('图像分类模型')
train(my_callback)