容器型別的協議:
如果說你希望定製的容器是不可變的話,你只需要定義__len__()和__getitem__()方法。 :如元組、字串
如果你希望定製的容器是可變的話,除了__len__()和__getitem__()方法,你還需要定義__setitem__()和__delitem__()兩個方法。
容器型別的魔法方法如下:
編寫乙個不可改變的自定義列表,要求記錄列表中每個元素被訪問的次數。
class countlist:
def __init__(self, *args):
self.values = [x for x in args]
self.count = {}.fromkeys(range(len(self.values)), 0)
def __len__(self):
return len(self.values)
def __getitem__(self, key):
self.count[key] += 1
return self.values[key]
注意本例中按下標進行訪問字典
iter():內建函式
__iter__():魔法方法
next()
__next__()
通常迭代器有字典、元組、列表
迭代器的簡單使用:
string='i am a iterable'
it=iter(string)
next(it)
next(it)
沒有元素了,則丟擲乙個stopiteration異常
for語句的工作原理模擬如下:
string='i am a iterable'
it=iter(string)
while true:
try:
each=next(it)
except stopiteration:
break
print(each)
class fibs:使用:def __init__(self):
self.a = 0
self.b = 1
def __iter__(self):
return self
def __next__(self):
self.a, self.b = self.b, self.a + self.b
return self.a
fibs=fibs()
for each in fibs:
print(each)
我們會發現這是個四迴圈,明顯沒有出口
可以用判斷each<20條件退出迴圈
也可以在迭代器定義的類中進行修改:
如下:
class fibs:使用:def __init__(self, n=20):
self.a = 0
self.b = 1
self.n = n
def __iter__(self):
return self
def __next__(self):
self.a, self.b = self.b, self.a + self.b
if self.a > self.n:
raise stopiteration
return self.a
fibs=fibs(100)
for each in fibs:
print(each)
Python3 魔法方法 定製序列
分別是 列表 元組 字串 python中的協議更像是一種指南,例如鴨子型別,乙隻鳥像鴨子一樣走,像鴨子一樣叫,像鴨子一樣遊然後這只鳥就可以叫做鴨子 如果希望定製的容器是不可變的,那麼只需要定義 len 和 getitem 方法 如果希望定製的容器是可變的,那麼還需要定義 setitem 和 deli...
魔法方法 定製序列(有關Protocol協議)
讀書筆記 重打 class countlist list def init self,args super.init args self count for i in args def len self return len self.count def getitem self,key self....
第047講 魔法方法 定製序列
常言道 無規矩不成方圓 講的是萬事萬物的發展都要在一定的規則下去執行,只有遵循一定的協議去做,事情才能夠按照正確的道路去發展。我們今天要談的是 定製容器,想要成功的實現容器的定製,我們要先談一談協議,那麼什麼是協議呢?協議 protlcols 與其他程式語言中的介面很相似,它規定你在哪些地方必須定義...