常见的运算符重载方法

2017-05-14  本文已影响12人  低吟浅唱1990
方法 重载 调用
__init__ 构造函数 对象建立:X = Class(args)
__del__ 析构函数 X对象收回
__repr__,__str__ 打印、装换 print(x),repr(x),str(x)
__add__ 运算符+ 如果没有__iadd__,X+Y,X+=Y
__call__ 函数调用 X(args,*kwargs)
__getattr__ 点号运算 X.undefined(拦截没有定义的属性)
__setattr__ 属性赋值语句 X.any = value(拦截赋值语句,注意避免循环)
__delattr__ 属性删除 del X.any
__getattribute__ 属性获取 X.any(拦截所有属性)
__getitem__ 索引运算 X[key],X[i:j],没有__iter__时的for循环和其他迭代器
__setitem__ 索引赋值语句 x[key]=value,x[i:j]=sequence
__delitem__ 索引和分片删除 del x[key],del x[i:j]
__len__ 长度 len(x)
__iter__,__next__ 迭代环境 I = iter(x),next(I)
__contains__ 成员关系测试 item in X(任何可迭代的)
__index__ 整数值 hex(x),bin(x)
__enter__,__exit__ 环境管理器 with obj as var:
__get__,__set__,__delete__ 描述符属性 X.attr,X.attr = value,del X.attr
__new__ 创建 在__init__之前创建对象

call表达式:__call__(注意不是拦截构造函数)
<pre>

class Callee:
def __call__(self,args,*kwargs):
print('Called:',args,kwargs)
c = Callee()
c(1,2,3)
Called:(1,2,3){}
c(1,2,3,x=4,y=5)
Called:(1,2,3){'y':5,'x':4}
</pre>

索引和分片__getitem__和__setitem__
如果在类中定义了的话,则对于实例的索引运算会自动调用_\getitem__。当实例x出现x[i]这样的索引运算时,会调用__getitem__。
<pre>

--coding:UTF-8--

class Indexer:
def __getitem__(self,index):
return index**2
if __name__ == '__main__':
x = Indexer()
print(x[2])

4
</pre>
除了索引分片表达式也调用__getitem__,内置类型以同样的方式处理分片
<pre>
class Indexer:
data = [5,6,7,8,9]
def __getitem__(self,index):
print('getitem:',index)
return self.data[index]
if __name__ == '__main__':
x = Indexer()
print(x[2:4])

getitem: slice(2, 4, None) #这里存在一个分片对象
[7, 8]
</pre>

上一篇下一篇

猜你喜欢

热点阅读