magic method(魔术方法)special method(特殊方法)的非正式同义词 。
一种由 Python 隐式调用的方法,用来对某个类型执行特定操作例如相加等等。这种方法的名称的首尾都为双下划线。特殊方法官方文档https://docs.python.org/zh-cn/3/reference/datamodel.html#specialnames
以双下划线 __ 包裹起来的方法,比如最常见的 __init__,这些方法被称为魔法方法(magic method)或特殊方法(special method),这些方法可以给 Python 的类提供特殊功能,方便我们定制一个类。简单地说,魔法方法是指Python内部已经包含的,被双下划线所包裹的方法,它们是一些可以让你对类添加“魔法”的特殊方法。如 __init__()、__str__()、__new__()、__unicode__()、__call__()几种。
Python一切皆对象,比如字面量123、“abc”也是对象,可以通过dir()来查看对象所拥有的特殊方法,如dir(123),参见下图:
对于内置的对象来说(比如整数、表、字符串等),Python为之准备好了一些特殊方法(special method),特殊方法又被成为魔法方法(magic method)。下面给出几个例子,感性认识一下。
Python的运算符是通过调用对象的特殊方法实现的。比如:
'abc' + 'xyz'
实际执行了如下操作:
'abc'.__add__('xyz')
参见下图:
所以,在Python中,两个对象是否能进行加法运算,首先就要看相应的对象是否有__add__()方法。一旦相应的对象有__add__()方法,即使这个对象从数学上不可加,我们都可以用加法的形式,来表达obj.__add__()所定义的操作。在Python中,运算符起到简化书写的功能,但它依靠特殊方法实现。
与运算符类似,许多内置函数也都是调用对象的特殊方法。比如
len([1,2,3])
实际上做的是
[1,2,3].__len__()
参见下图:
下面是我们常见的列表元素引用方式
li = [1, 2, 3, 4, 5, 6]
li[3]
实际上做的是调用
li.__getitem__(3)
参见下图:
待续