九.魔法方法、特性和叠代器
阿新 • • 發佈:2019-03-30
一個 self delet item 調用 大數 包含 默認 fir
0.Python中雙下劃線__有特殊意義。
1.構造函數和析構函數:
class Test: def __init__(self): #構造函數,創造實例默認執行 pass def __del__(self): #析構函數,程序全部運行完執行 pass
2.類的序列和映射協議,讓類的實例可以實現類似序列的操作。
class Test: # 構造函數,創造實例默認執行 def __init__(self): self.date={} #這個方法通常要設置字典為數據類型 print("Default start") # 析構函數,程序全部運行完執行 def __del__(self): print("Default end") # 讓實例可直接設置:A[key]=... def __setitem__(self, key, value): self.date[key]=value # 讓實例可直接訪問:A[item] def __getitem__(self, item): return self.date[item] # 讓實例可直接運行del A[key]def __delitem__(self, key): del self.date[key] # 讓實例可直接運行len(A) def __len__(self): return len(self.date) A=Test() #默認運行實例中的__setitem__ A["k1"]="abc" A["k2"]="ABC" #默認運行實例中的__getitem__ print(A["k1"],A["k2"]) #abc ABC print(A.date) #{‘k1‘: ‘abc‘, ‘k2‘: ‘ABC‘} #默認運行實例中的__len__ print(len(A)) #2 #默認運行__delitem__ del A["k1"] print(A.date) #{‘k2‘: ‘ABC‘}
3.類中函數property,通過設置property能夠實現類中某些函數.
class C: def __init__(self): self._x = 123 def getx(self): return self._x def setx(self, value): self._x = value def delx(self): del self._x x = property(getx, setx, delx, "I‘m the ‘x‘ property.") c=C() print(c.x) #c.x will invoke the getter c.x=456 #c.x = value will invoke the setter del c.x #del c.x the deleter
4.叠代器,一層層訪問數據,不同於列表要把全部數據加載到內存
it=iter(range(10)) #iter()函數獲得一個叠代器 print("first",it.__next__()) print("second",it.__next__()) print("third",it.__next__()) print(next(it)) print(next(it))
class TestIterator: def __init__(self): self.value=0 def __next__(self): #必須要有__iter__方法才可以實現叠代 self.value+=1 if self.value>10: raise StopIteration return self.value def __iter__(self): #__iter__方法讓類成為叠代器,包含__next__方法 return self #可以不用設置其他參數 TI=TestIterator() print(list(TI))
5.生成器,包含yield語句的函數都被稱為生成器
- 生成器不是使用return返回一個值,而是可以生產多個值,每次一個。每次使用yield生成一個值後,函數都將凍結,等待下次調用。
- 應用如下:
datelist=[[1,2,3],[4,5],[6]] def generator(date): for i in date: for j in i: yield j #generator(datelist)生成器是以叠代的形式推進數據,而不是數據全部處理好一個一個調用。大數據時能省內存 for ii in generator(datelist): print(ii, generator(datelist))
九.魔法方法、特性和叠代器