第八天:
Magic Methods
课程知识点速览
一、魔法方法概述
概念定义:在 Python 中,所有以双下划线包裹的方法(如
__init__、__str__)均统称为魔法方法(Magic Methods / 魔术方法 / dunder 方法,dunder 即 double underscore)。核心作用:魔法方法允许开发者将自定义类接入 Python 内置语法(如
print()、==、len()、[]、+等),自定义对象的内置行为。方法查看:Python 中任意类默认继承自
object类,已内置多种魔法方法。使用内置函数dir(obj)可查看对象的所有魔法方法与属性。
二、对象的字符串表示:__str__ 与 __repr__
默认行为:默认情况下,
print(obj)仅输出类名与内存地址(如<__main__.Book object at 0x...>)。可以通过重写以下方法进行自定义:__str__(self)用途:面向用户(人类),提供可读性强、友好直观的字符串表达。
触发场景:
print(obj)、str(obj)、字符串格式化(如f"{obj}")。返回值:必须返回字符串。
__repr__(self)用途:面向开发者/程序逻辑,提供结构明确、便于调试或可复现对象的字符串表达式。
触发场景:在交互式终端直接输入变量名、在容器(如
list、dict)中包含该对象并打印容器时、repr(obj)。
回退规则与建议
回退机制:若未定义
__str__但定义了__repr__,print(obj)会自动降级使用__repr__的返回值;反之,仅定义__str__时,容器内对象仍会显示为默认的内存地址。最佳实践:优先定义
__repr__保证基础开发调试体验,若需额外面向最终用户的显示格式,再补充__str__。
三、自定义相等比较:__eq__
默认机制:默认情况下
obj1 == obj2比较的是对象的内存地址(即标识是否相同,相当于is运算符)。__eq__(self, other)用途:自定义
==运算符的相等比较逻辑。应用场景:当两个独立对象的关键属性(如
id或主要字段)完全一致时,认为它们相等。规范做法:实现时可结合
isinstance(other, ClassName)进行类型校验。
四、容器化特征:__len__ 与 __getitem__
通过实现这两个方法,可以使自定义对象具备类似列表或字典等容器的行为特征:
__len__(self)用途:让对象支持
len(obj)内置函数。要求:必须返回大于等于
0的整数。
__getitem__(self, item)用途:让对象支持下标索引或键访问语法
obj[item]。结合使用:当类同时实现了
__len__与__getitem__时,不仅能像列表/字典一样取值,还能支持切片与迭代遍历。
五、自定义算术运算:__add__
__add__(self, other)用途:自定义
+加法运算符的逻辑。底层调用:表达式
obj1 + obj2在 Python 内部会被自动转换为obj1.__add__(obj2)的调用。典型用途:用于点/向量坐标叠加、数量合并、对象融合等场景,通常返回一个新的类实例。
评论