Python高级之__call__() 魔法方法

概述

  • 作用

    • 让「类的实例对象」可以像函数一样,直接加 () 调用
  • 语法

    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)
相关推荐
默_笙3 天前
🍙 给每个请求过安检:FastAPI 是怎么把校验写进类型注解的
python
小羊没烦恼!3 天前
初探性能优化——2个月到4小时的性能提升
java·开发语言·windows·算法·c#
qq_426003963 天前
启动playwright录制codegen生成自动化测试脚本
python·自动化
虎头金猫3 天前
4K 视频总卡在公网带宽?用 N1 + OpenList 把网盘播放链路重新理顺
运维·服务器·网络·python·容器·beautifulsoup·pandas
长沙三为智能科技3 天前
家政小程序开发从0到上线:五阶段交付流程与验收清单
python
伞伞悦读3 天前
【第38期】Python 模块与包详解:import、from、模块搜索路径、包结构和 __init__
开发语言·python
只睡四小时3 天前
Canvas 弹道联机实战:700 行 + 固定时间步长
python·websocket·html5·游戏开发·canvas
C语言小火车3 天前
C/C++ 为什么需要编译器?
开发语言·c++
奇思妙想聪明勤奋的小羊3 天前
DeepAgents第5章:子Agent 与上下文隔离—让 Agent学会委派
人工智能·python·学习·语言模型
lpfasd1233 天前
2026年第38周GitHub趋势周报
python·科技·github