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

Python的‌魔法方法‌

Python的‌魔法方法‌(Magic Methods),又称‌特殊方法‌或‌双下方法‌(Dunder Methods),是类中以双下划线(__)开头和结尾的方法,用于自定义类的行为,使其支持Python内置操作(如运算符、迭代、上下文管理等)‌。


1. 对象生命周期控制

  • __new__(cls[, ...])
    创建实例时首先调用,返回新对象(通常配合super().__new__使用)‌。
    示例:单例模式实现

    class Singleton:
    _instance = None
    def __new__(cls):
    if not cls._instance:
    cls._instance = super().__new__(cls)
    return cls._instance

  • __init__(self[, ...])
    初始化实例属性,在__new__之后自动调用‌45。
    示例:构造方法

    class Person:
    def __init__(self, name):
    self.name = name  # 初始化属性

  • __del__(self)
    对象销毁时调用,用于资源清理(如关闭文件)‌35。


2. 字符串表示与格式化

  • __str__(self)
    定义print(obj)str(obj)的输出(用户友好)‌78。
  • __repr__(self)
    定义repr(obj)或交互式环境的输出(开发者友好)‌78。
    示例

    class Point:
    def __str__(self):
    return f"Point({self.x}, {self.y})"
    def __repr__(self):
    return f"Point(x={self.x}, y={self.y})"


3. 运算符重载

  • 算术运算‌:__add__(self, other)+)、__sub__(self, other)-)等‌79。
  • 比较运算‌:__eq__(self, other)==)、__lt__(self, other)<)等‌39。
    示例:向量加法

    class Vector:
    def __add__(self, other):
    return Vector(self.x + other.x, self.y + other.y)


4. 容器类型模拟

  • __len__(self)‌:定义len(obj)的行为‌310。
  • __getitem__(self, key)‌:定义obj[key]的取值‌311。
  • __iter__(self)‌:使对象可迭代‌39。

5. 其他常用魔法方法

  • __call__(self[, ...])‌:使实例可像函数一样调用(如obj())‌25。
  • __getattr__(self, name)‌:访问不存在的属性时触发‌912。
  • __enter__/__exit__‌:实现上下文管理器(with语句)‌39。

设计哲学与注意事项

  • 隐式调用‌:魔法方法由Python解释器在特定场景自动触发,无需显式调用‌23。
  • 继承机制‌:多数魔法方法继承自object类,可重写以定制行为‌15。
  • 慎用原则‌:过度使用可能降低代码可读性,适合需要与内置类型交互的场景‌910。

通过合理使用魔法方法,开发者可以构建高度集成的自定义类,实现Python的“万物皆对象”哲学‌1213。

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

相关文章:

  • Java学习第八十七部分——四次挥手
  • Java设计模式之《备忘录模式》
  • 80V降5V,输出电流4A,应用于车载充电器
  • 工厂方法模式 Factory Method Pattern
  • 监控场景视频质量异常修复:陌讯动态增强算法实战解析
  • 深入浅出设计模式——创建型模式之建造者模式 Builder
  • LangChain API 功能介绍和使用示例
  • 单卡10分钟部署MiniCPM4-0.5B:轻量级大模型本地运行指南
  • ESP8266 AT 固件
  • Linux信号量:进程同步与互斥的核心机制
  • 人形机器人指南(十四)集成
  • 248°视野里的温柔革命:当清洁成为治愈城市的艺术
  • Qt 移动应用界面设计原则
  • 智能Agent场景实战指南 Day 23 : Agent安全与隐私保护
  • C++异常捕获:为何推荐按引用(by reference)捕获?
  • 【LeetCode 热题 100】(二)双指针
  • 基于Java+SQLServer2017实现(Web)酒店客房管理系统
  • MongoDB系列教程-教程概述
  • 系统选择菜单(ubuntu grub)介绍
  • 标量子查询 外表有多少重复值决定filter次数 转化 left join
  • Python三大Web框架:FastAPI vs Flask vs Django 详解与快速入门指南
  • BreachForums 黑客论坛强势回归
  • windows软件ARM64和AMD64(x64)区别,如何查看电脑支持哪种
  • JVM易混淆名称
  • 大型微服务项目:听书——多端重复提交订单问题适配器模式实现不同支付方式的选择零钱支付逻辑
  • 爬虫逆向之瑞数五案例:某某医学院(补环境,联调)
  • 适配器模式的三种C++实现
  • 宠物经济行业研究系列报告
  • electron-vite 动态加载脚本 实现动态插件
  • 如何为你的WordPress网站选择合适的安全插件