[       
   
       ]
宙飒天下网-ZhouSa.com		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) 


 
		 
		 
		 
		

还没有评论,来说两句吧...