当前位置: 首页 > news >正文

魔术方法__call__

__call__ 是一个特殊方法(也称为魔术方法),用于使一个类的实例能够像函数一样被调用。当定义了这个方法后,实例对象可以后接括号(即 ())来触发调用,这会让实例表现得像函数一样。

  1. 使实例可调用​:允许类的实例像函数一样被调用。
  2. 保持状态​:可以在多次调用之间保持实例的状态(因为实例可以存储属性)。
  3. 实现装饰器​:常用于实现装饰器类(Decorator Class)。
  4. 模拟函数行为​:让对象具备函数的行为,同时保留类的特性(如属性、方法)。

基本语法

class MyClass:def __call__(self, *args, **kwargs):# 定义调用时的行为return "Called with:", args, kwargsobj = MyClass()
result = obj(1, 2, 3, name="Alice")  # 触发 __call__
# result = obj()  # 触发 __call__
print(result)# ('Called with:', (1, 2, 3), {'name': 'Alice'})
# ('Called with:', (), {})

输出:​

('Called with:', (1, 2, 3), {'name': 'Alice'})

关键特点

  1. ​***args 和 **kwargs**​
    __call__ 可以接受任意数量的位置参数和关键字参数,类似于普通函数。

  2. 实例本身仍然是一个对象
    即使定义了 __call__,实例仍然可以拥有属性和方法:

    class Adder:def __init__(self, initial=0):self.total = initialdef __call__(self, x):self.total += xreturn self.totaladd = Adder(10)
    print(add(5))  # 15(10 + 5)
    print(add(3))  # 18(15 + 3)
  3. 用于装饰器
    __call__ 可以让类的实例作为装饰器使用:

    class Logger:def __init__(self, func):self.func = funcdef __call__(self, *args, ​**kwargs):print(f"Calling {self.func.__name__}")return self.func(*args, ​**kwargs)@Logger
    def greet(name):return f"Hello, {name}!"print(greet("Alice"))

    输出:​

    Calling greet
    Hello, Alice!

​**__call__ vs __init__**​

方法调用时机用途
__init__实例化时调用(obj = MyClass()初始化对象属性
__call__实例被调用时(obj()让实例像函数一样执行

实际应用场景

  1. 状态保持的函数​(类似闭包)

    class Counter:def __init__(self):self.count = 0def __call__(self):self.count += 1return self.countcounter = Counter()
    print(counter())  # 1
    print(counter())  # 2
  2. 实现策略模式

    class Multiply:def __call__(self, a, b):return a * bclass Add:def __call__(self, a, b):return a + bdef calculate(operation, a, b):return operation(a, b)print(calculate(Multiply(), 3, 4))  # 12
    print(calculate(Add(), 3, 4))      # 7
  3. 动态生成对象行为

    class Power:def __init__(self, exponent):self.exponent = exponentdef __call__(self, x):return x ​**​ self.exponentsquare = Power(2)
    cube = Power(3)
    print(square(4))  # 16
    print(cube(3))    # 27

总结

  • __call__ 让类的实例可以像函数一样被调用。
  • 适用于需要保持状态的函数、装饰器类、策略模式等场景。
  • 不同于 __init__,它控制的是实例的调用行为,而非初始化行为。

如果你想让一个对象既能存储数据又能像函数一样执行操作,__call__ 是一个非常有用的工具!

http://www.dtcms.com/a/266151.html

相关文章:

  • Redis缓存架构实战
  • Selenium Base全新升级版:新一代自动化框架实战解析
  • Python 的内置函数 range
  • 高边驱动 低边驱动
  • 黑暗中的爆破(船讯网Ais爬虫暨爬虫实战js逆向学习经验分享)
  • 车载以太网-IP 掩码 vlan 端口
  • SciPy 安装使用教程
  • [特殊字符] 电子机械制动(EMB)产业全景分析:从技术演进到千亿市场爆发
  • 高通QCS8550部署YOLO-NAS模型与性能测试
  • 使用excel中的MATCH函数进行匹配数据
  • Python数据库软件:查询与预测功能集成系统
  • Linux常见指令以及权限理解
  • 使用 Flask 构建基于 Dify 的企业资金投向与客户分类评估系统
  • HTTP详细介绍
  • Windows 10 2016 长期服务版
  • 仿小红书交流社区(微服务架构)
  • day 58 python打卡
  • AppInventor2 标签内容过多,如何做到可上下滑动?
  • 【WRFDA教程第一期】运行观测预处理程序(OBSPROC)
  • 数据结构:数组在编译器中的表示(Array Representation by Compiler)
  • oracle锁表,oracle解锁表,oracle用户连接数
  • ArcGISPro应用指南:ArcGISPro制图全流程详解
  • 前端面试专栏-算法篇:17. 排序算法
  • Redis常见性能问题和解决方案有哪些?
  • 《UE5_C++多人TPS完整教程》学习笔记41 ——《P42 蹲伏(Crouching)》
  • Flutter基础(ListView.builder)
  • Pandas 安装使用教程
  • 黑马python(二十四)
  • Java——初始guava(1)
  • win11设置任务栏为顶部