注意点:不同对象(更准确地说,不同类型/类)的魔法方法(Magic Methods,也叫特殊方法,以双下划线`__`开头和结尾)通常是不一样的。
不同对象(更准确地说,不同类型/类)的魔法方法(Magic Methods,也叫特殊方法,以双下划线__
开头和结尾)通常是不一样的。
魔法方法的核心作用是让不同类型的对象能够响应相同的语法或操作(比如+
、+=
、len()
、[]
等),但不同类型会根据自身特性实现不同的逻辑。
具体来说:
-
相同的魔法方法,不同的实现逻辑
例如__add__
(对应+
操作):- 整数(
int
)的__add__
实现的是数值相加(1 + 2 = 3
)。 - 字符串(
str
)的__add__
实现的是字符串拼接("a" + "b" = "ab"
)。 - 列表(
list
)的__add__
实现的是列表合并([1] + [2] = [1, 2]
)。
它们都响应
+
操作,但底层逻辑完全不同,这正是因为不同类型对__add__
的实现不同。 - 整数(
-
不同类型需要实现的魔法方法不同
不是所有类都需要实现全部魔法方法,而是根据自身功能需求选择性实现:- 若一个类需要支持
len(obj)
,就实现__len__
。 - 若需要支持
obj[key]
的访问(如列表、字典),就实现__getitem__
。 - 若需要支持
obj += other
,就实现__iadd__
(如列表用它实现extend
逻辑,整数用它实现累加逻辑)。
例如:
- 字典(
dict
)需要__getitem__
来支持d[key]
访问,但不需要实现__len__
以外的方法来支持len(d)
(因为它的长度逻辑是内置的)。 - 自定义的“学生”类可能只需要
__init__
(初始化属性),而不需要__add__
(因为“学生”对象通常不需要“相加”操作)。
- 若一个类需要支持
总结
魔法方法的设计体现了 Python 的“多态”特性:相同的语法/操作,在不同对象上有不同的实现。正因为不同对象的魔法方法可以(且通常需要)不一样,才能让整数、字符串、列表等类型在面对相同操作(如+
、+=
)时,表现出符合自身特性的行为。