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)
相关推荐
Sylvia33.2 小时前
LOL实时数据接入深度解析:从WebSocket到完整数据模型
java·网络·python·websocket·网络协议
梦想不只是梦与想2 小时前
Web 服务器网关协议:ASGI 和 WSGI
服务器·python·fastapi
ai小陈4 小时前
PyTorch DataLoader数据加载性能排查:GPU利用率低的实操指南
人工智能·pytorch·python·深度学习·ai·gpu算力
2601_962299247 小时前
Azure python操作系统列表
python·操作系统·azure·虚拟机·存储配置文件
2601_962071577 小时前
【Java报错已解决】org.springframework.beans.factory.BeanCreationException
java·开发语言
学术 学术 Fun8 小时前
如何用 API 与 Webhook 批量把图表图片转换成 VSDX
python·自动化·api·visio
淡海水8 小时前
07-04-并发-ConcurrentBag-T-工作窃取WorkStealing算法
开发语言·算法·c#·bag·concurrent·workstealing
2601_962100548 小时前
python包和模块的内容整理
python·模块·导入·虚拟环境·
CS_Zero9 小时前
C语言sizeof是函数吗?
c语言·开发语言
二进制漫游记9 小时前
FastAPI项目集成 Qdrant向量数据库+阿里云Embedding完整实战(工具封装+业务调用)
数据库·python·阿里云·embedding