Benjamin

静以修身,俭以养德,非澹薄无以明志,非宁静无以致远。
随笔 - 386, 文章 - 0, 评论 - 196, 引用 - 0
数据加载中……

常用Magic Methods魔数方法说明

构造与初始化
__new__(cls, [...)                类的初始化过程中第一个被执行的方法。
__init__(self, [...)                类的构造器,必须返回对象
__del__(self)                    析构函数。它定义了一个被垃圾回收的行为。它在类消除的时后需要做一些额外的行为时是非常有用 __del__很少被使用,因为它的调用是非常不稳定的;请谨慎使用!
__metaclass__    定义当前类的元类
__class__         查看对象所属的类
__base__ 获取当前类的父类
__bases__ 获取当前类的所有父类

类中的操作
比较方法
__cmp__(self, other)  实现了所有的比较运算符(如<, ==, !=)的行为,当self < other时__cmp__应该返回一个负整数,当self == other时返回0,self > other时返回正整数。python3被删除
__eq__(self, other)      定义相等符号的行为,==
__ne__(self,other)      定义不等符号的行为,!=
__lt__(self,other)      定义小于符号的行为,<
__gt__(self,other)     定义大于符号的行为,>
__le__(self,other)    定义小于等于符号的行为,<=
__ge__(self,other)   定义大于等于符号的行为,>=
数值魔术方法
_pos__(self)      实现一个取正数的操作(比如 +some_object ,python调用__pos__函数)
__neg__(self)    实现一个取负数的操作(比如 -some_object )
__abs__(self)    实现一个内建的abs()函数的行为
__invert__(self) 实现一个取反操作符(~操作符)的行为。想要了解这个操作的解释,参考the Wikipedia article on bitwise operations.
__round__(self, n) 实现一个内建的round()函数的行为。 n 是待取整的十进制数.
__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) 实现真实除法,注意,只有当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) 实现一个异或操作(^)的行为

反射算术运算符
所有的魔法方法做的事情与正常运算表示的意义是等价的。注意,下面参数othe必须保证该对像没有定义(或者返回NotImplemented的)它的非反射运算符。例如,在这个例子中,some_object.__radd__  只有在 other没有定义__add__的时候才会被调用。
__radd__(self, other) 反射加法
__rsub__(self, other) 反射减法的
__rmul__(self, other) 反射除法
__rfloordiv__(self, other) 反射地板除,使用//运算符的
__rdiv__(self, other) 反射除法,使用/运算符的.
__rtruediv__(self, other) 反射真除.注意只有from __future__ import division 的时候它才有效
__rmod__(self, other) 反射取模运算,使用%运算符.
__rdivmod__(self, other) 长除法,使用divmod()内置函数,当divmod(other,self)时被调用.
__rpow__ 反射乘方,使用**运算符的
__rlshift__(self, other) 反射左移,使用<<操作符.
__rrshift__(self, other) 反射右移,使用>>操作符.
__rand__(self, other) 反射位与,使用&操作符.
__ror__(self, other) 反射位或,使用|操作符.
__rxor__(self, other) 反射异或,使用^操作符.
增量运算
__iadd__(self, other) 加法赋值
__isub__(self, other) 减法赋值.
__imul__(self, other) 乘法赋值
__ifloordiv__(self, other) 整除赋值,地板除,相当于 //= 运算符.
__idiv__(self, other) 除法赋值,相当于 /= 运算符. python3中不存在
__itruediv__(self, other) 真除赋值,注意只有 whenfrom __future__ import divisionis,才有效.
__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) 当对象被切片时转换成int型。如果定义了一个可能被用来做切片操作的数值型,就应该定义__index__.
__trunc__(self) 当 math.trunc(self) 使用时被调用.__trunc__返回自身类型的整型截取 (通常是一个长整型).
__coerce__(self, other) 执行混合类型的运算,如果转换不能完成,应该返回None;否则,要返回一对两个元数的元组self和other, 被操作成同类型。python3被废弃
表示类
__str__(self)  定义当 str() 被一个类的实例调用时所要产生的行为。
__repr__(self) 定义 当 repr()  被一个类的实例调用时所要产生的行为。 str() 和 repr() 的主要区别是其目标群体。 repr() 返回的是机器可读的输出,而 str() 返回的是人类可读的。
__unicode__(self)  unicode() 和 str() 很相似,但是返回的是unicode字符串。python3这个方法已经不存在了,并且__bytes__(它的行为与__str__和__unicode__类似)成为新的自带方法来构造byte数组
__format__(self, formatstr) 定义当一个类的实例被用来用新式的格式化字符串方法进行格式化时所要产生的行为。
__hash__(self)  定义当 hash()被一个类的实例调用时所要产生的行为。它返回一个整数,用来在字典中进行快速比较。请注意,这通常也承担着实现__eq__。有下面这样的规则:a == b 暗示着 hash(a) == hash(b) 。
__nonzero__(self)  定义当 bool() 被一个类的实例调用时所要产生的行为。本方法应该返回True或者False。python3被命名为bool
__dir__(self) 定义当 dir() 被一个类的实例调用时所要产生的行为。该方法应该返回一个属性的列表给用户,如果重新定义了__getattr__或__getattribute__或者其它的动态生成属性,那么它对类的交互使用是至关重要的。
__sizeof__(self) 定义当 sys.getsizeof() 被一个类的实例调用时所要产生的行为。该方法应该以字节为单位,返回对象的大小。
属性访问控制
__getattr__(self, name) 定义如何处理用户试图访问一个不存在(不存在或还没创建)属性的行为。这对于捕获或者重定向一般的拼写错误非常有用,给出访问了不能访问的属性的警告(如果愿意,还可以推断并返回那个属性。),或者巧妙地处理一个AttributeError异常。
__setattr__(self, name, value)  与__getattr__不同,__setattr__是一个真正的封装方案。它允许定义当给一个存在或不存在的属性赋值时的行为,意味着对任何属性值的改变都可以定义一个规则。
__delattr__ 它与__setattr__非常像, 只不过是用来删除而不是设置属性。 __detattr__需要预防措施,就像setattr一样,当被调用时可能会引起无限递归(当__delattr__已经实现时,调用 del self.name 就会引起无限的递归)。
__getattribute__(self, name)  只有在新风格的类中才会被使用(所有的新风格类在Python最新的版本中,在老版本中,可以子类化object来获得一个新风格类。它允许定义一条规则来处理无论什么时候属性值被访问时的行为。比如类似于由于其它的伙伴犯错而引起的无限递归(这时就可以调用基类的__getattribute__方法来阻止它)。它也避免了对__getattr__的依赖,当__getattribute__方法已经实现的时候,__getattr__只有在__getattribute__被明确的调用或抛出一个AttributeError异常的时候才会被调用。,不常用。

容器相关
__len__(self) 返回容器的长度。对于可变和不可变容器的协议,这都是其中的一部分。
__getitem__(self, key) 定义当某一项被访问时,使用self[key]所产生的行为。这也是不可变容器和可变容器协议的一部分。如果键的类型错误将产生TypeError;如果key没有合适的值则产生KeyError。
__setitem__(self, key, value) 定义当一个条目被赋值时,使用self[nkey] = value所产生的行为。这也是协议的一部分。而且,在相应的情形下也会产生KeyError和TypeError。
__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。
__missing__(self, key) 其在dict的子类中被使用。它定义了当一个不存在字典中的键被访问时所产生的行为。(例如,如果我有一个字典d,当"george"不是字典中的key时,使用了d["george"],此时d["george"]将会被调用)。

反射
__instancecheck__(self, instance) 检查对象是否是您定义的类的一个实例(例.isinstance(instance, class).
__subclasscheck__(self, subclass) 检查类是否是定义类的子类 (例.issubclass(subclass, class)).
可调用对象
__call__(self, [args...]) 允许一个类的实例像函数一样被调用 在那些类的实例经常改变状态的时候会非常有效。“调用”这个实例是一种改变这个对象状态的直接和优雅的做法。

会话管理器 包装一个with语句来设置和清理相应对象的行为
__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()返回了对象的一个浅拷贝——这意味着,当实例本身是一个新实例时,它的所有数据都被引用, 因此,对于浅拷贝中数据的更改仍然可能导致数据在原始对象的中的改变。
__deepcopy__(self, memodict={}) 定义了当对类的实例调用copy.deepcopy()时所产生的行为。copy.deepcopy()返回一个深拷贝——对象和其数据都被拷贝了。memodict是对之前被拷贝的对象的一个缓存——这优化了拷贝过程并且阻止了对递归数据结构拷贝时的无限递归。要进行对一个单独的属性进行深拷贝时,调用copy.deepcopy(),并以memodict为第一个参数。
Pickling 序列化 对象
__getinitargs__(self)    如果想在类被unpickle的时候执行__init__方法,可重载__getinitargs__方法,它会返回一个元组,包含想传给__init__方法的参数。注意,这种方法只适用于低版本的Python。
__getnewargs__(self)  对于新式类,在unpickle的时候可以决定传给__new__方法的参数。以上方法可以返回一个包含想传给__new__方法的参数元组。
__getstate__(self)       除了储存__dict__中的原来的那些变量,可以自定义使用pickle序列化对象时想要储存的额外属性。这些属性将在unpickle文件时被__setstate__方法使用。
__setstate__(self, state)     当文件被unpickle时,其中保存的对象属性不会直接被写入对象的__dict中,而是会被传入这个方法。这个方法和__getstate__是配套的:当他们都被定义了的时候,可以任意定义对象被序列化存储时的状态。
__reduce__(self)          当定义扩展类(使用C语言实现的Python扩展类)时,可以通过实现__reduce__函数来控制pickle的数据。如果__reduce__()方法被定义了,在一个对象被pickle时它将被调用。如果它返回一个字符串,那么pickle在将在全局空间中搜索对应名字的对象进行pickle;它还可以返回一个元组,包含2-5个元素: 一个可以用来重建该对象的可调用对象,一个包含有传给该可调用对象参数的元组,传给__setstate__方法的参数(可选),一个用于待pickle对象列表的迭代器(译者注:这些对象会被append到原来对象的后面)(可选)调用对象,一个包含有传给该可调用对象参数的元组,传给__setstate__方法的参数(可选),一个用于待pickle对象列表的迭代器(译者注:这些对象会被append到原来对象的后面)(可选),一个用于待pickle的字典的迭代器(可选)。
__reduce_ex__(self)  是为兼容性而设计的。如果它被实现了,__reduce_ex__将会取代__reduce__在pickle时被执行。__reduce__可以同时被实现以支持那些不支持__reduce_ex__的老版本pickling API。

posted on 2020-06-24 20:59 Benjamin 阅读(436) 评论(0)  编辑 收藏 引用 所属分类: python


只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理