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)
相关推荐
小羊没烦恼!8 分钟前
浅谈SQL Server中的事务日志(二)----事务日志在修改数据时的角色
前端·数据库·后端·python·web安全·oracle
ss.li15 分钟前
rppg阅读笔记 2026.10.15
图像处理·python·计算机视觉
大貔貅喝啤酒26 分钟前
Unittest框架使用教程
自动化测试·python
一个简单的TTS开发者42 分钟前
中文TTS工具有哪些-8款主流方案横向对比
人工智能·后端·python·indextts
yunfanleo1 小时前
temperature 详解:大模型采样参数原理、三种用法与工程实践
人工智能·python·rpa
卢锡荣1 小时前
乐得瑞Type-c接口产品描述
c语言·开发语言
晴天的雨.9921 小时前
【C++】模板进阶
开发语言·c++·算法
CarIise1 小时前
Maven依赖传递与聚合工程
python·r语言·django
VidDown9 小时前
24fps 转 25fps 不只是改个数字:帧率转换、PAL/NTSC 与音频补偿
python·网络协议·音视频·视频编解码·视频
死磕音视频11 小时前
让小模型做选择题:限定候选项并读取 logits 概率的入门实践(附 Python 代码)
开发语言·python·大模型·文本分类·transformers