1. 程式人生 > >九.魔法方法、特性和叠代器

九.魔法方法、特性和叠代器

一個 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))

九.魔法方法、特性和叠代器