类的魔术属性
#用于比较的魔术方法
__cmp__(self, other) 是比较方法里面最基本的的魔法方法
__eq__(self, other) 定义相等符号的行为,==
__ne__(self,other) 定义不等符号的行为,!=
__lt__(self,other) 定义小于符号的行为,<
__gt__(self,other) 定义大于符号的行为,>
__le__(self,other) 定义小于等于符号的行为,<=
__ge__(self,other) 定义大于等于符号的行为,>=
#单目运算符和函数
__pos__(self) 实现一个取正数的操作
__neg__(self) 实现一个取负数的操作
__abs__(self) 实现一个内建的abs()函数的行为
__invert__(self) 实现一个取反操作符(~操作符)的行为
__round__(self, n) 实现一个内建的round()函数的行为
__floor__(self) 实现math.floor()的函数行为
__ceil__(self) 实现math.ceil()的函数行为
__trunc__(self) 实现math.trunc()的函数行为
#双目运算符或函数
__add__(self, other) 实现一个加法
__sub__(self, other) 实现一个减法
__mul__(self, other) 实现一个乘法
__floordiv__(self, other) 实现一个“//”操作符产生的整除操作()
__div__(self, other) 实现一个“/”操作符代表的除法操作
__truediv__(self, other) 实现真实除法
__mod__(self, other) 实现一个“%”操作符代表的取模操作
__divmod__(self, other) 实现一个内建函数divmod()
__pow__ 实现一个指数操作(“**”操作符)的行为
__lshift__(self, other) 实现一个位左移操作(<<)的功能
__rshift__(self, other) 实现一个位右移操作(>>)的功能
__and__(self, other) 实现一个按位进行与操作(&)的行为
__or__(self, other) 实现一个按位进行或操作的行为
__xor__(self, other) __xor__(self, other)
#增量运算
__iadd__(self, other) 加法赋值
__isub__(self, other) 减法赋值
__imul__(self, other) 乘法赋值
__ifloordiv__(self, other) 整除赋值,地板除,相当于 //= 运算符
__idiv__(self, other) 除法赋值,相当于 /= 运算符
__itruediv__(self, other) 真除赋值
__imod_(self, other) 模赋值,相当于 %= 运算符
__ipow__ 乘方赋值,相当于 **= 运算符
__ilshift__(self, other) 左移赋值,相当于 <<= 运算符
__irshift__(self, other) 左移赋值,相当于 >>= 运算符
__iand__(self, other) 与赋值,相当于 &= 运算符
__ior__(self, other) 或赋值
__ixor__(self, other) 异或运算符,相当于 ^= 运算符
#类型转换
__int__(self) 转换成整型
__long__(self) 转换成长整型
__float__(self) 转换成浮点型
__complex__(self) 转换成 复数型
__oct__(self) 转换成八进制
__hex__(self) 转换成十六进制
__index__(self) 如果你定义了一个可能被用来做切片操作的数值型,你就应该定义__index__
__trunc__(self) 当 math.trunc(self) 使用时被调用__trunc__返回自身类型的整型截取
__coerce__(self, other) 执行混合类型的运算
#控制属性访问
__getattr__(self, name):
定义当用户试图获取一个不存在的属性时的行为。这适用于对普通拼写错误的获取和重定向,
对获取一些不建议的属性时候给出警告(如果你愿意你也可以计算并且给出一个值)或者处理一个
AttributeError 。只有当调用不存在的属性的时候会被返回。
__setattr__(self, name, value):
与__getattr__(self, name)不同,__setattr__ 是一个封装的解决方案。无论属性是否存在,
它都允许你定义对对属性的赋值行为,以为这你可以对属性的值进行个性定制。实现__setattr__
时要避免"无限递归"的错误。
__delattr__:
与 __setattr__ 相同,但是功能是删除一个属性而不是设置他们。实现时也要防止无限递归
现象发生。
__getattribute__(self, name):
__getattribute__定义了你的属性被访问时的行为,相比较,__getattr__只有该属性不存在
时才会起作用。因此,在支持__getattribute__的Python版本,调用__getattr__前必定会调用
__getattribute__。__getattribute__同样要避免"无限递归"的错误。需要提醒的是,最好不要
尝试去实现__getattribute__,因为很少见到这种做法,而且很容易出bug
#自定义容器
__len__(self):
返回容器的长度。对于可变和不可变容器的协议,这都是其中的一部分。
__getitem__(self, key):
定义当某一项被访问时,使用self[key]所产生的行为。这也是不可变容器和可变容器协议
的一部分。如果键的类型错误将产生TypeError;如果key没有合适的值则产生KeyError。
__setitem__(self, key, value):
当你执行self[key] = value时,调用的是该方法。
__delitem__(self, key):
定义当一个项目被删除时的行为(比如 del self[key])。这只是可变容器协议中的一部分。
当使用一个无效的键时应该抛出适当的异常。
__iter__(self):
返回一个容器迭代器,很多情况下会返回迭代器,尤其是当内置的iter()方法被调用的时候,
以及当使用for x in container:方式循环的时候。迭代器是它们本身的对象,它们必须定义返回
self的__iter__方法。
__reversed__(self):
实现当reversed()被调用时的行为。应该返回序列反转后的版本。仅当序列可以是有序的时
候实现它,例如对于列表或者元组。
__contains__(self, item):
定义了调用in和not in来测试成员是否存在的时候所产生的行为。你可能会问为什么这个不
是序列协议的一部分?因为当__contains__没有被定义的时候,如果没有定义,那么Python会迭
代容器中的元素来一个一个比较,从而决定返回True或者False。
__missing__(self, key):
dict字典类型会有该方法,它定义了key如果在容器中找不到时触发的行为。比如d = {'a': 1},
当你执行d[notexist]时,d.__missing__['notexist']就会被调用。
#反射
__instancecheck__(self, instance):
检查一个实例是不是你定义的类的实例
__subclasscheck__(self, subclass):
检查一个类是不是你定义的类的子类
#调用
__call__(self, [args...]):
允许一个类的实例像函数一样被调用。实质上说,这意味着 x() 与 x.__call__() 是相同的。
注意 __call__ 的参数可变。这意味着你可以定义 __call__ 为其他你想要的函数,无论有多少个
参数。
#上下文管理
__enter__(self):
定义了当使用with语句的时候,会话管理器在块被初始创建时要产生的行为。请注意,__enter__
的返回值与with语句的目标或者as后的名字绑定。
__exit__(self, exception_type, exception_value, traceback):
定义了当一个代码块被执行或者终止后,会话管理器应该做什么。它可以被用来处理异常、执行
清理工作或做一些代码块执行完毕之后的日常工作。如果代码块执行成功,exception_type,
exception_value,和traceback将会为None。否则,你可以选择处理这个异常或者是直接交给用户处理。
如果你想处理这个异常的话,请确保__exit__在所有语句结束之后返回True。如果你想让异常被会话管
理器处理的话,那么就让其产生该异常。
#创建对象描述器
__get__(self, instance, owner):
定义了当描述器的值被取得的时候的行为。instance是拥有该描述器对象的一个实例。owner是拥有者本身
__set__(self, instance, value):
定义了当描述器的值被改变的时候的行为。instance是拥有该描述器类的一个实例。value是要设置的值。
__delete__(self, instance):
定义了当描述器的值被删除的时候的行为。instance是拥有该描述器对象的一个实例。
#复制
__copy__(self):
定义了当对你的类的实例调用copy.copy()时所产生的行为。copy.copy()返回了你的对象的一个浅
拷贝——这意味着,当实例本身是一个新实例时,它的所有数据都被引用了——例如,当一个对象本身被复
制了,它的数据仍然是被引用的(因此,对于浅拷贝中数据的更改仍然可能导致数据在原始对象的中的
改变)。
__deepcopy__(self, memodict={}):
定义了当对你的类的实例调用copy.deepcopy()时所产生的行为。copy.deepcopy()返回了你的对象
的一个深拷贝——对象和其数据都被拷贝了。memodict是对之前被拷贝的对象的一个缓存——这优化了拷贝
过程并且阻止了对递归数据结构拷贝时的无限递归。当你想要进行对一个单独的属性进行深拷贝时,调
用copy.deepcopy(),并以memodict为第一个参数。
浙公网安备 33010602011771号