魔术方法
一、构造与初始化
init(self, ...)- 在对象实例化时自动调用,用于初始化实例属性(如设置默认值或接收参数)。
- 示例:
class MyClass:
def
__init__
(self, name):
self.name = name# 初始化属性
new(cls, ...)- 在对象创建前调用,负责实例的生成并返回实例对象(常用于单例模式或不可变类型定制)。
二、对象表示与格式化
str(self)- 定义对象的用户友好字符串表示(通过
print()或str()调用)。 - 示例:
class Book:
def
__str__
(self):
return f"{self.title} by {self.author}"
repr(self)- 提供明确的开发调试信息(在交互式环境或
repr()调用时生效)。
三、属性管理
- **
getattr(self, name)**当访问不存在的属性时触发(用于动态属性生成或错误处理)。 - **
setattr(self, name, value)**拦截属性赋值操作(可添加校验逻辑或触发副作用)。 - **
delattr(self, name)**在删除属性时调用(如资源释放)。
四、容器操作
- **
len(self)**返回容器长度(支持len()函数调用)。 - **
getitem(self, key)**实现索引或键访问(如obj[key])。 - **
setitem(self, key, value)**通过索引或键设置元素(如obj[key] = value)。
五、运算符重载
算术运算
__add__(self, other):实现加法(+)__sub__(self, other):实现减法()__mul__(self, other):实现乘法()
比较运算
__eq__(self, other):等于判断(==)__lt__(self, other):小于判断(<)
六、特殊行为扩展
call(self, ...)- 使实例可像函数一样调用(如
obj())。 - 示例:
class Adder:
def
__call__
(self, a, b):
return a + b
add = Adder()
print(add(3, 5))# 输出
上下文管理
__enter__(self):进入with代码块时调用__exit__(self, ...):退出with代码块时调用(处理异常或资源释放)
迭代控制
__iter__(self):返回迭代器对象__next__(self):控制迭代过程(支持for循环)
七、其他实用方法
- **
slots**限制实例可添加的属性(节省内存)。 - **
del(self)**对象销毁前调用(处理资源清理)。 - **
dir(self)**返回对象的公开属性和方法列表(增强 IDE 支持)。
应用场景示例
- 自定义数据结构:通过容器类方法(
getitem、len)模拟列表或字典行为。 - 运算符扩展:实现向量类的加减运算(
add、sub)。 - 装饰器逻辑:结合
call方法创建状态保持的装饰器