[
]
宙飒天下网 1. 运算符重载
运算符重载在任何语言中都算得上是高级特性,因为它可以改变语言本身即元编程. Python支持有限的运算符重载,并有几个特殊的运算符可以改变类的一些特性.
本节需要的先验知识有:
2. 受限制的运算符重载
在某些圈子中,运算符重载的名声并不好.这个语言特性可能(已经)被滥用,让程序员困惑,导致缺陷和意料之外的性能瓶颈.但是,如果使用得当,API会变得好用,代码会变得易于阅读.Python施加了一些限制,做好了灵活性、可用性和安全性方面的平衡:
- 不能重载内置类型的运算符
- 不能新建运算符,只能重载现有的
- 某些运算符不能重载——is、and、or 和not(不过位运算符&、| 和~ 可以)
下面是python所有可以重载的运算符以及对应的特殊方法:
一元运算符 | 特殊方法 |
---|---|
+ | __pos__ |
- | __neg__ |
~ | __invert__ |
abs(...) | __abs__ |
二元运算符 | 特殊方法 |
---|---|
+ | __add__,__radd__ |
+= | __iaddr__ |
- | __sub__,__rsub__ |
* | __mul__,__rmul__ |
/ | __div__,__rdiv__,__truediv__,__rtruediv__ |
// | __floordiv__,__rfloordiv__ |
% | __mod__,__rmod__ |
** | __pow__,__rpow__ |
<< | __lshift__,__rlshift__ |
>> | __rshift__,__rrshift__ |
& | __and__,__rand__ |
^ | __xor__,__rxor__ |
l | __or__,__ror_ |
-= | __isub__ |
*= | __imul__ |
/= | __idiv__,__itruediv__ |
//= | __ifloordiv__ |
%= | __imod__ |
**= | __ipow__ |
<<= | __ilshift__ |
>>= | __irshift__ |
&= | __iand__ |
^= | __ixor__ |
l= | __ior__ |
== | __eq__ |
!= ,<> | __ne__ |
> | __get__ |
< | __lt__ |
>= | __ge__ |
<= | __le__ |
@ | __matmul__() ,__rmatmul__() |
@= | __imatmul__() |
例: 定义一个数组类,实现减法索引打印等操作
class Array: def __init__(self,*args):#构造函数 self.value = args def __sub__(self,other):#减法运算符 if isinstance(other,(int ,float)): new = Array(*list(map(lambda x : x-other,self.value))) return new if isinstance(other,Array): new = Array(*list(map(lambda x,y : x-y,self.value,other.value))) return new else: raise ValueError("Illegal operations") def __repr__(self):#打印 return "Array: "+str(self.value) def __str__(self):#字符串化 return "Array: "+str(self.value) def __getitem__(self,index):#索引分片,有了分片也就有了迭代,但不如迭代器好 new = Array(*self.value[index]) return new
arr1=Array(1,2,3,4) arr2=Array(10,20,30,40) arr2-arr1
Array: (9, 18, 27, 36)
还没有评论,来说两句吧...