关于__call__
或许这篇就能满足你!!!
一、触发场景
- 对象函数式调用
当使用实例对象()
语法调用类实例时自动触发 - 装饰器应用
实现类装饰器时通过__call__
接收被装饰函数 - 动态行为模拟
需要对象在不同调用场景下表现不同功能时触发
二、核心功能
功能维度 | 具体描述 |
---|---|
函数化对象 | 使类实例具备函数调用特性,支持obj(arg1, arg2) 语法 |
状态保持 | 在多次调用间保留实例属性值,实现有状态的函数对象 |
参数动态处理 | 支持接收任意数量位置参数(*args )和关键字参数(**kwargs ) |
装饰器工厂 | 通过类封装装饰逻辑,支持带参数的装饰器实现 |
策略模式实现 | 根据初始化参数动态改变调用时的处理逻辑 |
三、方法参数
参数类型 | 接收方式 | 典型应用场景 |
---|---|---|
位置参数 | *args 元组接收 |
数值计算、数据处理等场景 |
关键字参数 | **kwargs 字典接收 |
配置项传递、日志分级等场景 |
实例属性 | 通过self 访问初始化时设置的参数 |
状态保持型调用 |
四、具体案例解析
1. 状态保持函数对象
场景:创建有状态的计数器,每次调用自动累加
class Counter:
def __init__(self):
self.count = 0
def __call__(self):
self.count += 1
return self.count
counter = Counter()
print(counter()) # 输出:1
print(counter()) # 输出:2
要点:
- 通过
__call__
实现无参数调用时的状态更新 - 实例属性
count
在多次调用间保留值
2. 装饰器模式实现
场景:创建带参数的重试装饰器