Python中类的运算符重载

王朝学院·作者佚名  2016-08-27
窄屏简体版  字體: 小  |  中  |  大  |  超大  

这篇文章仅仅是总结性质的,待以后有时间的时候会针对比较难理解的部分补充一些例子。

构造和析构__init__

__del__

函数调用__call__

打印操作__str__

__rePR__

str(x), print(X):会先尝试__str__方法,然后尝试__repr__方法;repr(X)或交互模式下输入X,只会尝试__repr__方法。

属性操作__getattr__:只有类中没有定义的属性点号运算才会尝试该方法

__setattr__:类中所有属性的赋值语句都会尝试该方法,self.attr=val会变成self.setattr('attr',val)

__delattr__

__getattribute__:类中所有属性的点号运算都会尝试该方法

索引与分片__getitem__

__setitem__

__delitem__

迭代环境__iter__

__next__

在所有的迭代环境中,会先尝试__iter__方法,然后在尝试__getitem__方法,但是注意迭代器根本没有重载索引表达式,所以如果需要通过while来根据下标手工迭代,那么需要定义__getitem__方法。

成员测试__contains__

in成员测试会先尝试__contains__方法,然后是__iter__方法,最后是__getitem__方法。

描述符属性__get__

__set__

delete

主要这里是__delete__,也析构函数__del__是完全不同的。

比较大小__lt__

__le__

__gt__

__ge__

__eq__: !=和==都会尝试该方法,所以需要确保两个运算符都正确地作用。

请看下面的实例:

class X:

def __init__(self, value):

self.data = value

def __eq__(self, value):

return self.data == value

x = X(4)

print(x ==5)

print(x != 5)

结果为

False

True

数学运算操作__add__,__iadd__,__radd__

__sub__,__isub__,__rsub__

__mul__,__imul__:乘法

__neg__,__pos__:表示-obj, +obj

__abs__

__floordiv__,__ifloordiv__,__truediv__,__itruediv__

__mod__,__imod__,__imod__

__pow__,__ipow__

a += b会尝试增强加法__iadd__,然后尝试普通加法__add__

x = b + obj:如果b不是类实例时,会调用右侧加法__radd__

当我们把两个实例相加的时候,Python运行__add__,它反过来通过简化左边的运算数来触发__radd__。

对象运算操作__concat__:比如序列a,b的加法a+b

__iconcat__

位运算符__and__,__iand__

__or__,__ior__,__xor__,__ixor__

__inv__,__invert__: ~obj

__lshift__,__ilshift__,__rshift__,__irshift__

a &=b:会先尝试__iand__,然后尝试__add__

布尔测试__bool__

__len__

布尔测试会先尝试一个特定的__bool__方法,然后在尝试__len__方法。在Python2.6中使用的名称不是__bool__,而是__nonzero__

环境管理主要是用于with语句的上下文管理。

__enter__

__exit__

用来定义类__new__

这个函数会在类初始化函数__init__()之前调用

整数值__index__

如果在bin(X), hex(X), oct(X), O[X], O[X:]等需要传入一个数字、索引、分片的值时传入一个对象,那么该对象的__index__会被调用。

主要是用来替代Python2.x中的__oct__,__hex__

 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
 
© 2005- 王朝網路 版權所有 導航