https://pyzh.readthedocs.io/en/latest/python-magic-methods-guide.html
我们最为熟知的基本的魔法方法就是 __init__ ,我们可以用它来指明一个对象初始化的行为。然而,当我们调用 x = SomeClass() 的时候, __init__ 并不是第一个被调用的方法。事实上,第一个被调用的是 __new__ ,这个 方法才真正地创建了实例。当这个对象的生命周期结束的时候, __del__ 会被调用。让我们近一步理解这三个方法:
__new__(cls,[...)
__new__ 是对象实例化时第一个调用的方法,它只取下 cls 参数,并把其他参数传给 __init__ 。 __new__ 很少使用,但是也有它适合的场景,尤其是当类继承自一个像元组或者字符串这样不经常改变的类型的时候。我不打算深入讨论 __new__ ,因为它并不是很有用, Python文档 中 有详细的说明。
__init__(self,[...])
类的初始化方法。它获取任何传给构造器的参数(比如我们调用 x = SomeClass(10, ‘foo’) , __init__ 就会接到参数 10 和 ‘foo’ 。 __init__ 在Python的类定义中用的最多。
__del__(self)
__new__ 和 __init__ 是对象的构造器, __del__ 是对象的销毁器。它并非实现了语句 del x (因此该语句不等同于 x.__del__())。而是定义了当对象被垃圾回收时的行为。 当对象需要在销毁时做一些处理的时候这个方法很有用,比如 socket 对象、文件对象。但是需要注意的是,当Python解释器退出但对象仍然存活的时候, __del__ 并不会 执行。 所以养成一个手工清理的好习惯是很重要的,比如及时关闭连接。
创建一个像内建类型那样的对象
1.比较操作符
__cmp__(self, other)
__eq__`(self, other)
定义等于操作符(==)的行为
__ne__(self, other)
定义不等于操作符(!=)的行为__lt__(self, other)
定义小于操作符(<)的行为__gt__(self, other)
定义大于操作符(>)的行为__le__(self, other)
定义小于等于操作符(<)的行为__ge__(self, other)
定义大于等于操作符(>)的行为2.数值操作符
__pos__(self)
实现取正操作,例如 +some_object。
__neg__(self)
实现取负操作,例如 -some_object。
__abs__(self)
实现内建绝对值函数 abs() 操作。
__invert__(self)
实现取反操作符 ~。
__round__(self, n)
实现内建函数 round() ,n 是近似小数点的位数。
__floor__(self)
实现 math.floor() 函数,即向下取整。
__ceil__(self)
实现 math.ceil() 函数,即向上取整。
__trunc__(self)
实现 math.trunc() 函数,即距离零最近的整数。
3.算术操作符
__add__(self, other)
实现加法操作。
__sub__(self, other)
实现减法操作。
__mul__(self, other)
实现乘法操作。
__floordiv__(self, other)
实现使用 // 操作符的整数除法。
__div__(self, other)
实现使用 / 操作符的除法。
__truediv__(self, other)
实现 _true_ 除法,这个函数只有使用 from __future__ import division 时才有作用。
__mod__(self, other)
实现 % 取余操作。
__divmod__(self, other)
实现 divmod 内建函数。
__pow__
实现 ** 操作符。
__lshift__(self, other)
实现左移位运算符 << 。
__rshift__(self, other)
实现右移位运算符 >> 。
__and__(self, other)
实现按位与运算符 & 。
__or__(self, other)
实现按位或运算符 | 。
__xor__(self, other)
实现按位异或运算符 ^ 。
