Python的常用magicmethod
以下是Python中最常用且功能强大的魔术方法(Magic Methods)及其核心用途的分类详解,这些方法以双下划线(__)包裹,由Python解释器在特定场景下自动调用,用于定制类行为:
🔧 一、对象生命周期管理
-
init(self, …)
• 作用:对象初始化方法,在实例创建后设置初始属性。• 触发时机:obj = MyClass(args)
• 示例:
class Person: def init(self, name): self.name = name p = Person(“Alice”) # 自动调用 init -
del(self)
• 作用:析构方法,对象被销毁(垃圾回收)时调用。• 触发时机:del obj 或对象离开作用域。
• 示例:
class Resource: def del(self): print(“资源已释放”)
📝 二、对象表示与格式化
-
str(self)
• 作用:返回用户友好的字符串表示,供 print() 或 str() 使用。• 示例:
class Vector: def str(self): return f"Vector({self.x}, {self.y})" print(Vector(1, 2)) # 输出: Vector(1, 2) -
repr(self)
• 作用:返回官方字符串表示,用于调试或 repr(),理想情况下应满足 eval(repr(obj)) == obj。• 示例:
class Point: def repr(self): return f"Point({self.x}, {self.y})"
⚖️ 三、比较与运算
-
比较运算符
• eq(self, other):定义 ==• lt(self, other):定义 <
• 示例:
class Book: def eq(self, other): return self.isbn == other.isbn -
算术运算符
• add(self, other):实现 +• mul(self, other):实现 *
• 示例:向量加法
class Vector: def add(self, other): return Vector(self.x + other.x, self.y + other.y)
📦 四、容器行为模拟
-
len(self)
• 作用:返回容器长度,供 len(obj) 调用。• 示例:
class CustomList: def len(self): return len(self.items) -
getitem(self, key)
• 作用:支持索引访问,如 obj[key]。• 示例:
class MyList: def getitem(self, index): return self.data[index] -
iter(self)
• 作用:返回迭代器,使对象支持 for 循环。• 示例:
class Range: def iter(self): return iter(range(self.end))
🔍 五、属性访问控制
-
getattr(self, name)
• 作用:当访问不存在的属性时调用(兜底处理)。• 示例:
class Dynamic: def getattr(self, name): return f"属性 {name} 不存在" -
setattr(self, name, value)
• 作用:设置属性时拦截并验证。• 示例:禁止负年龄
class Person: def setattr(self, name, value): if name == “age” and value < 0: raise ValueError(“年龄不能为负”) super().setattr(name, value)
📞 六、可调用对象
• call(self, …)
• 作用:使实例像函数一样被调用(obj())。
• 应用场景:装饰器、状态保持的函数。
• 示例:
class Adder:
def call(self, x, y):
return x + y
add = Adder()
print(add(2, 3)) # 输出: 5
⚠️ 使用建议与注意事项
-
一致性原则
• 实现魔法方法时需符合Python内置类型的行为(如 len 返回非负整数)。 -
避免过度使用
• 仅在必要时重载,避免降低代码可读性(例如,不要用 add 实现非加法逻辑)。 -
调试支持
• 优先实现 repr 而非 str,因其在调试时更关键。 -
性能敏感场景
• getattribute 影响所有属性访问,需谨慎实现以防性能瓶颈。
总结:魔术方法是Python面向对象编程的核心机制,通过定制这些方法,开发者可使自定义类无缝集成到Python生态中(如支持运算符、迭代、上下文管理等)。合理使用能大幅提升代码表达力,但需平衡灵活性与可维护性。