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

Python 中的魔术方法(Magic Methods)

Python 中的魔术方法(Magic Methods)


一、核心概念

  • 命名规范__xxx__(双下划线包围,如 __init__
  • 自动调用:由 Python 解释器在特定时机调用,而非用户手动调用。
  • 目的:让自定义类支持运算符、内置函数、迭代、上下文管理等高级特性。
  • 别名:Magic Methods / Dunder Methods(Double UNDERscore)

二、常用魔术方法分类详解

1. 对象构造与析构

方法 说明 示例
__new__(cls, ...) 创建对象实例(先于 __init__),用于控制对象创建过程,常用于单例模式或不可变类型。 见下方示例
__init__(self, ...) 初始化对象,构造函数,设置实例属性。 def __init__(self, name): self.name = name
__del__(self) 析构函数,对象被销毁时调用(不保证立即执行,依赖垃圾回收)。慎用! def __del__(self): print("对象被销毁")
__new__ 示例(单例模式)
class Singleton:_instance = Nonedef __new__(cls, *args, **kwargs):if cls._instance is None:cls._instance = super().__new__(cls)return cls._instancedef __init__(self, value):self.value = values1 = Singleton(10)
s2 = Singleton(20)
print(s1 is s2)  # True —— 同一个对象
print(s1.value)  # 20 —— 最后一次初始化的值

⚠️ 注意:__new__ 是静态方法,第一个参数是 cls__init__ 是实例方法,第一个参数是 self

2. 对象表示与字符串

方法 说明 示例
__str__(self) str(obj)print(obj) 时调用,返回用户友好的字符串。 return f"Person: {self.name}"
__repr__(self) repr(obj) 或交互式解释器中直接输入对象时调用,返回开发者友好、无歧义的字符串,理想情况下应能 eval 重建对象。 return f"Person('{self.name}', {self.age})"
__format__(self, format_spec) 支持 format(obj, spec) 或 f-string 格式化。 见下方示例
__str__ vs __repr__ 示例
class Person:def __init__(self, name, age):self.name = nameself.age = agedef __str__(self):return f"{self.name}, {self.age}岁"def __repr__(self):return f"Person(name='{self.name}', age={self.age})"p = Person("Alice", 30)
print(p)           # 调用 __str__ → Alice, 30岁
print(repr(p))     # 调用 __repr__ → Person(name='Alice', age=30)
__format__ 示例
class Temperature:def __init__(self, celsius):self.celsius = celsiusdef __format__(self, spec):if spec == "f":return f"{self.celsius * 9/5 + 32:.1f}°F"elif spec == "k":return f"{self.celsius + 273.15:.1f}K"else:return f"{self.celsius:.1f}°C"temp = Temperature(25)
print(f"{temp}")     # 25.0°C
print(f"{temp:f}")   # 77.0°F
print(f"{temp:k}")   
http://www.dtcms.com/a/391385.html

相关文章:

  • JavaScript事件循环机制----event loop
  • C++编程学习(第33天)
  • 伺服上位机展示
  • Class62 优化算法
  • 电气专业科研怎么入门?电气仿真入门秘籍
  • 软考-系统架构设计师 基于构件的软件工程详细讲解
  • MCP 项目标准管理工具 v1.1.0 发布:新增 API 调试功能,助力 AI 辅助开发标准化
  • Linear Algebra in Competitive Programming
  • Decision Trees vs Neural Networks|决策树 vs 神经网络
  • FreeRTOS——任务管理
  • MSXML4.0是什么?下载安装+常见错误修复一网打尽
  • Claude Code生态
  • Node v22.19 Nest.js 安装 better-sqlite3
  • Android compose Room Sqlite 应用 (注入式)
  • 缓存穿透+缓存雪崩+缓存击穿(解决方法+实战)
  • Docker技术相对于虚拟机技术的优劣势对比!
  • MyBatis框架与参数详解
  • Confluent-Kafka-go 发布超过 1M 消息失败问题解决
  • 数字图像处理-函数矩阵
  • 基于 ST-Link 和 MDK-Keil 的 STM32 程序下载实验
  • 安防监控系统的架构与组成原理
  • 【前端】【threeJs】前端事件偏移问题完整总结
  • web:ts的类型兼容性
  • 黑盒测试:测试用例设计之场景法(流程图法)(模拟用户实际使用软件的场景来设计测试用例,适用于业务流程复杂的系统测试)基本流、备选流
  • Django + Vue3 前后端分离技术实现自动化测试平台从零到有系列 <第二章> 之 平台功能架构整理
  • 神经网络学习笔记14——高效卷积神经网络架构EfficientNet
  • Flutter实现滑动页面停留吸附
  • 【Linux】基本指令介绍
  • 爬虫逆向--Day22Day23--核心实战案例【荔枝网】【WASM学习】----待完成
  • 【软考-系统架构设计师】特定领域软件体系结构(DSSA)