## 跟运算符无关的特殊方法
### 1. 实例的创建和销毁
__init__
解释:构造方法,可调用超类的构造器。这是实例级别的方法,发生在实例创建之后,用于初始化实例,给实例添加一些属性和操作
__new__
解释:优先于__init__被调用。这是类级别的方法,控制类生成实例的过程,然后通常返回该类的一个实例
__del__
解释:用于销毁实例化对象,释放内存空间。注:通常情况下,python的垃圾回收机制(引用计数)会自动销毁没用的实例
### 2. 字符串/字节序列表示形式
__repr__
解释:把对象用字符串的形式表达出来,默认返回值为:“类名 + object at 内存地址”,可自定义为我们想要的信息
__str__
解释:与__repr__类似,不同的地方在于:__str__是在用str()或者用print()打印一个对象时被调用,并且返回的字符串对终端用户更友好
__format__
解释:当字符串/字节序列对象调用format()时被调用
__bytes__
解释:讲对象转换成二进制字节串,对应python内置函数bytes()
### 3. 数值转换
__abs__
解释:对应python内置函数abs(),计算绝对值
__bool__
解释:对应python内置函数bool(),判断值的真假。如果实例不存在__bool__方法,bool(object)将尝试调用实例的__len__方法,如果返回0,bool将返回False,否则返回True
__complex__
解释:对应python内置函数complex(),用于创建一个值为 real + imag * j 的复数或者转化一个字符串或数为复数。如果第一个参数为字符串,则不需要指定第二个参数
__int__
解释:对应python内置函数int(),用于将数字或字符串转换为整数。
__float__
解释:对应python内置函数float(),用于将数字或字符串转换成浮点数。
__hash__
解释:对应python内置函数hash(),用于获取一个对象的哈希值。
__index__
解释:对应python内置函数index(),用于从列表中找出某个值第一个匹配项的索引位置。
### 4. 集合模拟
__len__
解释:对应python内置函数len(),返回对象(字符、列表、元组等)长度或项目个数。注意:如果len(object)中的object是python的内置类型,那么Cpython会抄个近路,在调用__len__方法时,实际上会直接返回PyVarObject里面的ob_size属性,这里的PyVarObject是表示内存中长度可变的内置对象的C语言结构体,直接读取这个值的速度比调用一个方法快得多
__getitem__
解释:如果在类中定义了这个__getitem__方法,那么这个类的实例就可以通过"实例[key]"进行取值,比如:[1,2,3][0],{‘a’:1, ‘b’:2}[‘a’]
__setitem__
解释:如果在类中定义了这个__setitem__方法,那么这个类的实例就可以通过"实例[key]=某值"进行赋值,比如:[1,2,3][0] = 6,{‘a’:1, ‘b’:2}[‘a’] = 3
__delitem__
解释:如果在类中定义了这个__delitem__方法,那么这个类的实例就可以通过"del 实例[key]"进行删除值,比如:del [1,2,3][0],del {‘a’:1, ‘b’:2}[‘a’]
__contains__
解释:如果在类中定义了这个__contains__方法,那么就可以通过python的"in"运算符来判断对应的值是否存在于类实例中
### 5. 迭代枚举
__iter__
解释:对应python内置函数iter(),用来生成迭代器,可以通过for循环调用next()方法
__reversed__
解释:对应python内置函数reversed(),用来生成反向迭代器,可以通过for循环调用next()方法
__next__
解释:对应python内置函数next(),返回迭代器的下一个项目,迭代器中必然包含__next__方法,迭代器调用for循环将自动调用next()
### 6. 可调用模拟
__call__
解释:如果在类中定义了这个__call__方法,那么将使得类实例对象可以像调用普通函数那样,以"对象名()"的形式使用。
### 7. 上下文管理
__enter__和__exit__
解释:实现了上下文管理协议的上下文管理器中,必然包含了__enter__和__exit__这两个方法,比如:with语句,with语句开始运行时,调用__enter__方法,with语句运行结束时,调用__exit__方法
### 8. 属性管理
__getattr__
解释:对应python内置函数getattr(),用于返回一个对象属性值。当访问一个对象中不存在的属性时,会抛出异常,提示不存在这个属性。而这个异常就是__getattr__方法抛出的。我们可以自定义该方法
__getattribute__
解释:该方法可以拦截对对象属性的所有访问企图,当属性被访问时,自动调用该方法(只适用于新式类)。因此常用于实现一些访问某属性时执行一段代码的特性。注意:直接通过类访问类属性不会调用该方法
__setattr__
解释:对应python内置函数setattr(),在对一个实例对象的属性设置值的时候,会调用到这个方法,每个设置值的方式都会进入该方法。
__delattr__
解释:对应python内置函数delattr(),用于删除实例对象的属性
__dir__
解释:对应python内置函数dir(),用于获取某个实例对象拥有的所有的属性名和方法名
### 9. 属性描述符
__get__、__set__和__delete__
解释:定义三个方法中的任意一个,这个对象就会被认为是一个描述符,并且可以在被作为对象属性时重载默认的行为。如果一个对象定义了__get__()和 __set__(),它被认为是一个数据描述符,只定义__get__()被认为是非数据描述符
### 10. 跟类相关的业务
__prepare__
解释:该方法只在元类中有用,而且必须声明为类方法,解释器调用元类的__new__之前会先调用__prepare__,使用类定义体中的属性创建映射。该方法第一个参数是元类,随后两个参数分别是要构建的类的名称和基类组成的元组,返回值必须是映射。元类构建新类的时候,该方法的返回映射会传给__new__的最后一个参数,然后在传给__init__方法
__instancecheck__
解释:对应python内置函数isinstance(),检测一个实例对象是否属于某个类的实例。注意:这个方法一定要定义在元类当中才有意义
__subclasscheck__
解释:对应python内置函数issubclass(),判断一个类是不是另一个类的子类。注意:这个方法一定要定义在元类当中才有意义
## 跟运算符相关的特殊方法
### 1. 一元运算符
__neg__
对应运算符:-(负号)
__pos__
对应运算符:+(正号)
__abs__
对应运算符:abs() (绝对值)
### 2. 算数运算符
__add__
对应运算符:+(加号)
__sub__
对应运算符:-(减号)
__mul__
对应运算符:*(乘号)
__truediv__
对应运算符:/(除号)
__floordiv__
对应运算符://(地板除、整除)
__mod__
对应运算符:%(求余)
__divmod__
对应运算符:divmod()
__pow__
对应运算符:**或pow()
__round__
对应运算符:round()
### 3. 比较远算符
__lt__
对应运算符:<
__le__
对应运算符:<=
__eq__
对应运算符:==
__ne__
对应运算符:!=
__gt__
对应运算符:>
__ge__
对应运算符:>=
### 4. 反向算术运算符
__radd__
对应运算符:反向+
__rsub__
对应运算符:反向-
__rmul__
对应运算符:反向*
__rtruediv__
对应运算符:反向/
__rfloordiv__
对应运算符:反向//
__rmod__
对应运算符:反向%
__rdivmod__
对应运算符:反向divmod()
__rpow__
对应运算符:反向**或pow()
### 5. 增量赋值算数运算符
__iadd__
对应运算符:+=
__isub__
对应运算符:-=
__imul__
对应运算符:*=
__itruediv__
对应运算符:/=
__ifloordiv__
对应运算符://=
__imod__
对应运算符:%=
__ipow__
对应运算符:**=
### 6. 位运算符
__invert__
对应运算符:~
__lshift__
对应运算符:<<
__rshift__
对应运算符:>>
__and__
对应运算符:&
__or__
对应运算符:|
__xor__
对应运算符:^
### 7. 反向位运算符
__rlshift__
对应运算符:反向<<
__rrshift__
对应运算符:反向>>
__rand__
对应运算符:反向&
__ror__
对应运算符:反向|
__rxor__
对应运算符:反向^
### 8. 增量赋值位运算符
__ilshift__
对应运算符:<<=
__irshift__
对应运算符:>>=
__iand__
对应运算符:&=
__ior__
对应运算符:|=
__ixor__
对应运算符:^=