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)
相关推荐
从零开始学习人工智能5 小时前
【踩坑实录】WSL2 解决 onnxruntime\-gpu ImportError: libcudart\.so\.13 无 CUDA13 运行库问题
python
WWJA王文举6 小时前
I²C通信完整流程详解:START、地址、ACK、数据、Repeated START和STOP一次讲透
c语言·开发语言
卷无止境6 小时前
在 awesome-fastapi 里,哪些库值得一看?
后端·python
zhanghaha13146 小时前
Python进阶教程:6_JSON 数据解析 —— 新手完全指南
开发语言·python·json
Python私教7 小时前
API 输出模型怎么设计:从 model_dump() 到显式展示层
python·fastapi
Python私教7 小时前
本地 AI 工具服务该绑定 127.0.0.1 还是 0.0.0.0?
python·fastapi
卷无止境7 小时前
FastAPI 的Admin面板生态
后端·python
qq_448011168 小时前
C语言中的动态内存分配
c语言·开发语言·php
ctlover8 小时前
Streamlit 框架
python
ι:8 小时前
MATLAB 与 Python 搭建无人机地面站:优势、劣势与选型逻辑
python·matlab·无人机