python中以__xxx__存在的方法被称为魔法方法。下面记录几个常用的。

__name__

当python文件被直接运行时,__name__的值为__main__,而当python文件以模块的形式被导入时,__name__的值为模块名。
可以利用__name__ == __main__隐藏不希望被作为导入模块执行的代码块。

__file__

在python模块中使用__file__来获取脚本所在的相对路径,如果希望得到绝对路径可以使用os.path.realpath(__file__)

__module__

当前操作的对象在哪个模块。

__all__

当文件被以import *方式导入时,哪些成员(变量、函数或类)会被导入进来。

__init____new__

__init__初始化方法,负责对实例化对象进行属性值初始化,此方法必须返回None。
__new__是类构造方法,用于产生实例化对象,必须返回一个对象。

  1. __new__ 是在一个对象实例化的时候所调用的第一个方法
  2. 它的第一个参数是这个类,其他的参数是用来直接传递给 __init__ 方法
  3. __new__ 决定是否要使用该 __init__方法,因为 __new__ 可以调用其他类的构造方法或者直接返回别的实例对象来作为本类的实例,如果 __new__ 没有返回实例对象,则 __init__ 不会被调用
  4. __new__ 主要是用于继承一个不可变的类型比如一个 tuple 或者 string

__del__

析构方法,当对象在内存中被释放时,自动触发此方法。

__call__

该方法提供给对象可以被执行的能力,当直接利用对象执行时,调用该方法。

__dict__

返回对象的属性字典,key为属性名,value为该属性的值。

__len__

可以通过len(A)调用,在应用中主要用于返回数据集的长度。

__gititem__

定义该方法后,可以通过E(key)调用,所以在定义时除了self参数外,还有key参数。在应用中通常用于数据集类中,返回索引到的数据。

1
2
3
4
5
6
7
8
class E:
def __init__(self) ->None:
self.dict = {k1:v1;k2:v2}
def __gititem(self,key):
return self.dict[key]

e = E()
e[key]

__iter__

生成迭代对象时用,如果一个对象拥有__iter__方法,其是可迭代对象。该方法返回一个迭代器。内置函数iter()调用的就是对象的__iter__

1
2
3
4
5
6
7
8
9
class E:
def __init__(self) ->None:
pass

def __iter__(self):
return self

e = E()
e[key]

__next__

返回容器中的下一个元素,与__iter__配合使用实现迭代器。内置函数next()调用的就是对象的__next__

__add__

重载此方法可以使类的实例进行相加。

__abs__

有此方法可以直接使用abs方法

1
2
3
4
5
6
7
8

class Vector:
def __init__(self, x=0, y=0):
self.x = x
self.y = y

def __abs__(self):
return self.x+self.y

__doc__

用于输出指定对象中的注释部分

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
class Debug:
"""
This is a class for debugging
"""
def __init__(self):
"""
This funtion only has one property
"""
self.x = 5


# debug
main = Debug()
print(main.__doc__) # This is a class for debugging
print(main.__init__.__doc__) # This funtion only has one property

参考资料

Python中类的魔术方法
Python类的内置方法
python内置方法之完整版