类的魔术属性

#用于比较的魔术方法
__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为第一个参数。

posted @ 2020-11-20 21:37  浓墨均散过往  阅读(46)  评论(0)    收藏  举报
1 2