这篇博客整理了一下常用的 Python 魔法函数

__init__()

所有类的超类 object,有一个默认包含 pass 的 __init__() 实现,这个函数会在对象初始化的时候调用,我们可以选择实现,也可以选择不实现,一般建议是实现的,不实现对象属性就不会被初始化,虽然我们仍然可以对其进行赋值,但是它已经成了隐式的了,编程时显示远比隐式的更好。

__new__()

在object类中存在一个静态的 __new__(cls, *args, **kwargs) 方法,该方法需要传递一个参数 cls,cls 表示需要实例化的类,此参数在实例化时由 Python 解释器自动提供, __new__ 方法必须有返回值,且返回的是被实例化的实例,只有在该实例返回后才会调用 __init__ 来进行初始化,初始化所用的实例就是 __new__ 返回的结果,也就可以认为是 self。

__iter__()

只要定义了 __iter__() 方法对象,就是可迭代对象;这意味着,我们可以迭代我们自己定义的对象。

__next__()

函数next() 是 iterator 区别于 iterable 的关键,它允许我们显式地获取一个元素。当调用 next() 方法时,实际上产生了 2 个操作:一是更新 iterator 状态,令其指向后一项,以便下一次调用,二是返回当前结果。

__call__()

对象通过提供 __call__() 方法可以模拟函数的行为,如果一个对象提供了该方法,就可以像函数一样使用它。

__len__()

len 调用后会调用对象的 __len__ 函数,我们可以为其定制输出。

__str__()

直接打印对象的实现方法,__str__ 是被 print 函数调用的,一般都是 return 一个什么东西,这个东西应该是以字符串的形式表现的。如果不是要用 str() 函数转换,我们可以直接 print 的对象都是实现了 __str__ 这个方法的,比如 dict。

__repr__()

函数 str() 用于将值转化为适于人阅读的形式,而 repr() 转化为供解释器读取的形式,某对象如果没有适于人阅读的解释形式的话,我们可以定制 __repr__ 的输出。

__setitem__()

该函数可以给对象赋值,我们可以以下标的方式对其进行操作

__getitem__()

与上函数相反,__getitem__ 可以使对象支持以下标的方式获取值。

__delitem__()

该函数支持以下标方式删除对象数据,实现了这三个函数,这个类就像字典一样,具备了基本的增删查功能,有时候这样写会很方便。

__del__()

这可以说是一个析构器,或者回收器,在对象引用数降到0时执行,有时可能还需要等一会再执行,所以一般不推荐使用,但是在代码中我们偶尔可以用它来实现一些必须要做的,但是并不紧急的事。

__setattr__()

该函数可以设置函数的属性。

__getattr__()

获取对象属性,只有在属性没有找到的时候调用。

__getattribute__()

该函数和上面介绍的 __getattr__ 很像,都是获取属性,但是 __getattr__ 是在属性不存在时被调用,而 __getattribute__ 是无条件被调用,这样会方便我们做一些控制,需要注意,一旦定义 了 __getattribute__,则 __getattr__ 不再会被调用,除非显式调用。

__delattr__()

本函数的作用是删除属性,实现了该函数的类可以用 del 命令来删除属性。

持续更新中…