python的運算子過載可以算是語言的一大特色了。相比c#,python進行運算子過載將會方便許多,只需要重寫以__開頭和結尾的特殊方法即可,下面看乙個簡單的例子:
# 迭代器
class indexer(object):
value = 1
# 加法運算過載
def __add__(self, value):
return self.value + value
indexer = indexer()
print(indexer + 3)
列印結果為4,可以看出來對indexer物件使用+運算子執行的是我們定義在__add__ 中的邏輯。其它的運算子過載也遵照這一方法。
method
overload call
__init__
建構函式 物件建立: x = class(args)
__del__
析構函式 x物件收回
__add__
運算子+ 如果沒有_iadd_, x+y, x+=y
__or__
運算子__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__
索引運算 x[key],x[i:j]
__setitem__
索引賦值語句 x[key],x[i:j]=sequence
__delitem__
索引和分片刪除 del x[key],del x[i:j]
__len__
長度 len(x),如果沒有__bool__,真值測試
__bool__
布林測試 bool(x)
__lt__, __gt__, __le__, __ge__, __eq__, __ne__
特定的比較 xy,x<=y,x>=y, x==y,x!=y
__radd__
右側加法 other+x
__iadd__
實地(增強的)加法 x+=y(or elseadd)
__iter__, __next__
迭代環境 i=iter(x), next()
__contains__
成員關係測試 item in x(任何可迭代)
__index__
整數值 hex(x), bin(x), oct(x)
__enter__, __exit__
環境管理器 with obj as var:
__get__, __set__, __delete__
描述符屬性 x.attr, x.attr=value, del x.attr
__new__
建立 在__init__之前建立物件
paython3.0中迭代器需要實現的迭代方法變更為了__next__而不是2.x版本的next
# 迭代器
class myiterator(object):
self.offset = 0
def __next__(self):
# 如果超出迭代範圍直接丟擲異常
raise stopiteration('stop')
self.offset += 1
return item
class indexer(object):
data = [1, 2, 3, 4, 5, 6, 7]
# 迭代器重載
def __iter__(self):
return myiterator(self.data)
indexer = indexer()
for x in indexer:
print(x)
測試
123
4567
[finished in 0.2s]
Python 運算子過載
在 python 中is 是兩個運算子,對物件進行比較,分別對id,type value 進行比較。is 比較id type value三維 而 僅 比較value。實驗發現其實is,僅僅是比較一些簡單的基礎變數。class test object def init self self.value ...
Python運算子過載
print 呼叫父類建構函式 def parentmethod self print 呼叫父類方法 def setattr self,attr self.parentattr attr def getattr self print 父類屬性 self.parentattr def del self ...
python 運算子過載
運算子過載就是讓用類寫成的物件,可截獲並響應用在內建型別上的運算 加法,切片,列印和點號運算等 1.以雙下劃線命名的方法 x 的特殊鉤子,python運算子過載的實現是提供特殊命名的方法來攔截運算,python替每種運算和特殊命名的方法之間,定義了固定不變的對映關係 2.當例項出現在內建運算時,這類...