少女祈祷中...
min blog

python学习第八天日记

第八天:

Magic Methods

课程知识点速览

一、魔法方法概述

  1. 概念定义:在 Python 中,所有以双下划线包裹的方法(如 __init____str__)均统称为魔法方法(Magic Methods / 魔术方法 / dunder 方法,dunder 即 double underscore)。

  2. 核心作用:魔法方法允许开发者将自定义类接入 Python 内置语法(如 print()==len()[]+ 等),自定义对象的内置行为。

  3. 方法查看:Python 中任意类默认继承自 object 类,已内置多种魔法方法。使用内置函数 dir(obj) 可查看对象的所有魔法方法与属性。

二、对象的字符串表示:__str____repr__

  1. 默认行为:默认情况下,print(obj) 仅输出类名与内存地址(如 <__main__.Book object at 0x...>)。可以通过重写以下方法进行自定义:

  2. __str__(self)

    • 用途:面向用户(人类),提供可读性强、友好直观的字符串表达。

    • 触发场景print(obj)str(obj)、字符串格式化(如 f"{obj}")。

    • 返回值:必须返回字符串。

  3. __repr__(self)

    • 用途:面向开发者/程序逻辑,提供结构明确、便于调试或可复现对象的字符串表达式。

    • 触发场景:在交互式终端直接输入变量名、在容器(如 listdict)中包含该对象并打印容器时、repr(obj)

  4. 回退规则与建议

    • 回退机制:若未定义 __str__ 但定义了 __repr__print(obj) 会自动降级使用 __repr__ 的返回值;反之,仅定义 __str__ 时,容器内对象仍会显示为默认的内存地址。

    • 最佳实践优先定义 __repr__ 保证基础开发调试体验,若需额外面向最终用户的显示格式,再补充 __str__

三、自定义相等比较:__eq__

  1. 默认机制:默认情况下 obj1 == obj2 比较的是对象的内存地址(即标识是否相同,相当于 is 运算符)。

  2. __eq__(self, other)

    • 用途:自定义 == 运算符的相等比较逻辑。

    • 应用场景:当两个独立对象的关键属性(如 id 或主要字段)完全一致时,认为它们相等。

    • 规范做法:实现时可结合 isinstance(other, ClassName) 进行类型校验。

四、容器化特征:__len____getitem__

通过实现这两个方法,可以使自定义对象具备类似列表或字典等容器的行为特征:

  1. __len__(self)

    • 用途:让对象支持 len(obj) 内置函数。

    • 要求:必须返回大于等于 0 的整数。

  2. __getitem__(self, item)

    • 用途:让对象支持下标索引或键访问语法 obj[item]

    • 结合使用:当类同时实现了 __len____getitem__ 时,不仅能像列表/字典一样取值,还能支持切片与迭代遍历。

五、自定义算术运算:__add__

  1. __add__(self, other)

    • 用途:自定义 + 加法运算符的逻辑。

    • 底层调用:表达式 obj1 + obj2 在 Python 内部会被自动转换为 obj1.__add__(obj2) 的调用。

    • 典型用途:用于点/向量坐标叠加、数量合并、对象融合等场景,通常返回一个新的类实例。

六、常见魔法方法语法对照表

语法 / 内置函数

背后调用的魔法方法

主要功能描述

print(obj) / str(obj)

__str__

面向用户的可读性字符串表达

交互式命令行 / repr(obj) / 容器内打印

__repr__

面向开发者的结构化/调试字符串

obj1 == obj2

__eq__

自定义逻辑相等判断

len(obj)

__len__

返回对象的长度或元素个数

obj[index] / obj[key]

__getitem__

支持索引访问或键查找

obj1 + obj2

__add__

自定义 + 加法运算符行为

评论