這篇文章主要介紹了詳解Python運算子重載實例程式碼分享的相關資料,需要的朋友可以參考下
Python運算子重載
Python語言提供了運算子重載功能,增強了語言的彈性,這點與C++有點類似又有些不同。鑑於它的特殊性,今天就來討論一下Python運算子重載。
Python語言本身提供了許多魔法方法,而它的運算子重載就是透過重寫這些Python內建的魔法方法來實現。這些魔法方法都是以雙底線開頭和結尾的,類似於__X__的形式,python透過這種特殊的命名方式來攔截操作符,以實現重載。當Python的內建操作運用於類別物件時,Python會去搜尋並呼叫物件中指定的方法完成操作。
類別可以重載加減運算、列印、函數呼叫、索引等內建運算,運算子重載使我們的物件的行為與內建物件相同的行為。 Python在呼叫運算元時會自動呼叫這樣的方法,例如,如果類別實作了__add__方法,當類別的物件出現在+運算子中時會呼叫這個方法。
常見運算子重載方法
#方法名稱 |
重載說明 |
|
__init__ | 建構子 | 物件建立: X = Class(args) |
__del__ | 析構函數 | X物件收回 |
__add__/__sub__ | 加減運算 | X+Y,X+=Y/X-Y,X-=Y |
#__or__ | 運算子| | X|Y, X|=Y |
_repr__/__str__ | #列印/轉換 | ##print(X) 、repr(X)/str(X) |
__call__ |
函數呼叫 | ##X(*args, **kwargs) |
#__getattr__ | ##屬性參考X.undefined | |
#__setattr__ | 屬性賦值 |
| #X.any=value
#__delattr__ | #屬性刪除 | del X.any |
__getattribute__ | 屬性取得 | #X.any |
__getitem__ | 索引運算 | |
#__setitem__ |
索引賦值 |
|
#__delitem__ |
索引和分片刪除 |
|
#__len__ |
長度 |
|
__bool__ |
布林測試 |
|
##__lt__ , __gt__, __le__, __ge__, | #__eq__, __ne__ | 特定的比較
#特定的比較 。為X | X==Y,X!=Y
le: less equal, ge: greater equal, | eq: equal, ne: not equal ) |
__radd__ |
#右側加法 |
#other+X |
|
實地(增強的)加法 | X+=Y(or else __add__) | |
#迭代 | I=iter(X), next( ) | |
#成員關係測試 | ##item in X (X為任何可迭代物件) | |
#整數值 | ||
##hex(X), bin(X), oct(X) |
||
#__enter__, __exit__ |
#環境管理器 |
with obj as var: |
以下對常用的運算子方法的使用進行一下介紹。
建構子與析構函數:__init__與__del__
# 它們的主要功能是進行物件的建立與回收,當實例創建時,就會呼叫__init__建構方法。當實例物件被收回時,析構函數__del__會自動執行。
>>> class Human(): ... def __init__(self, n): ... self.name = n ... print("__init__ ",self.name) ... def __del__(self): ... print("__del__") ... >>> h = Human('Tim') __init__ Tim >>> h = 'a' __del__
加減運算:__add__與__sub__
重載這兩個方法就可以在普通的物件上加上+-運算子操作。下面的程式碼示範如何使用+-運算符,如果將程式碼中的__sub__方法去掉,再呼叫減號運算子就會出錯。
>>> class Computation(): ... def __init__(self,value): ... self.value = value ... def __add__(self,other): ... return self.value + other ... def __sub__(self,other): ... return self.value - other ... >>> c = Computation(5) >>> c + 5 10 >>> c - 3 2
物件的字串表達形式:__repr__與__str__
>>> class Str(object): ... def __str__(self): ... return "__str__ called" ... def __repr__(self): ... return "__repr__ called" ... >>> s = Str() >>> print(s) __str__ called >>> repr(s) '__repr__ called' >>> str(s) '__str__ called'
#索引取值與賦值:__getitem__, __setitem__
>>> class Indexer: data = [1,2,3,4,5,6] def __getitem__(self,index): return self.data[index] def __setitem__(self,k,v): self.data[k] = v print(self.data) >>> i = Indexer() >>> i[0] 1 >>> i[1:4] [2, 3, 4] >>> i[0]=10 [10, 2, 3, 4, 5, 6]
class A(): def __init__(self,ax,bx): self.a = ax self.b = bx def f(self): print (self.__dict__) def __getattr__(self,name): print ("__getattr__") def __setattr__(self,name,value): print ("__setattr__") self.__dict__[name] = value a = A(1,2) a.f() a.x a.x = 3 a.f()
__setattr__ __setattr__ {'a': 1, 'b': 2} __getattr__ __setattr__ {'a': 1, 'x': 3, 'b': 2}
迭代器物件: __iter__, __next__
## Python中的迭代,可直接透過重複載__getitem__方法來實現,看下面的例子。
>>> class Indexer: ... data = [1,2,3,4,5,6] ... def __getitem__(self,index): ... return self.data[index] ... >>> x = Indexer() >>> for item in x: ... print(item) ... 1 2 3 4 5 6
透過上面的方法是可以實現迭代,但不是最好的方式。 Python的迭代操作會優先嘗試呼叫__iter__方法,然後再嘗試__getitem__。迭代環境是透過iter去嘗試尋找__iter__方法來實現,而這個方法回傳一個迭代器物件。如果這個方法已經提供,Python會重複呼叫迭代器物件的next()方法,直到發生StopIteration異常。如果沒有找到__iter__,Python才會嘗試使用__getitem__機制。下面看一下迭代器的例子。
class Next(object): def __init__(self, data=1): self.data = data def __iter__(self): return self def __next__(self): print("__next__ called") if self.data > 5: raise StopIteration else: self.data += 1 return self.data for i in Next(3): print(i) print("-----------") n = Next(3) i = iter(n) while True: try: print(next(i)) except Exception as e: break
程式的運作結果如下:
__next__ called 4 __next__ called 5 __next__ called 6 __next__ called ----------- __next__ called 4 __next__ called 5 __next__ called 6 __next__ called
以上是詳解Python運算子重載實例程式碼分享的詳細內容。更多資訊請關注PHP中文網其他相關文章!