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)
相关推荐
eggwyw10 分钟前
C++中大括号的用法合集
开发语言·c++
xiaoye-duck12 分钟前
《C++ 项目:手写大模型接入 SDK》本地 Ollama 部署与适配
开发语言·网络·c++·语言模型
特立独行的猫A23 分钟前
13MB 单文件、一条命令变服务:把仓颉写的 cjh 内嵌进你的应用,当它的 AI 大脑
java·后端·python
deepseek2331 分钟前
Agent任务中途断线,怎么避免重复执行?SQLite检查点实测
python·sqlite·任务调度·幂等性·ai agent
联犀34 分钟前
联犀 Go SIMD 实战:视频转码从 16.5ms 到 5.46ms
开发语言·golang·音视频
octopus_c43 分钟前
STL 之 string:auto 与范围 for、常用接口、模拟实现与深浅拷贝
开发语言·c++·算法
Nerd(BUG版)1 小时前
KMP学习day5--Kotlin Flow异步流基础
开发语言·学习·kotlin
J.YA1 小时前
String字符串[面试题]
java·开发语言
2401_868534781 小时前
【网络安全
网络·python
xiaoye-duck12 小时前
《C++ 项目:手写大模型接入 SDK》Gemini接口设计(上):初始化、全量响应实现和测试
开发语言·网络·c++·语言模型