1. 程式人生 > >Python3 魔法方法:定制序列

Python3 魔法方法:定制序列

move 魔法方法 ini 定義 行為 color for log pre

1、基於序列的三大容器

分別是 列表、元組、字符串

2、協議

python中的協議更像是一種指南,例如鴨子類型,一只鳥像鴨子一樣走,像鴨子一樣叫,像鴨子一樣遊然後這只鳥就可以叫做鴨子

3、容器類型的協議

如果希望定制的容器是不可變的,那麽只需要定義__len__ 和__getitem__ 方法

如果希望定制的容器是可變的,那麽還需要定義 __setitem__ 和__delitem__方法

4、魔法方法

_len__(self)

定義當被 len() 調用時的行為(返回容器中元素的個數)

__getitem__(self, key)

定義獲取容器中指定元素的行為,相當於 self[key]

__setitem__(self, key, value)

定義設置容器中指定元素的行為,相當於 self[key] = value

__delitem__(self, key)

定義刪除容器中指定元素的行為,相當於 del self[key]

例子:自定義一個列表類,完成list所有功能,並增counter(index)方法返回index對應值Mylist[index]的訪問次數

class Mylist:
    def __init__
(self,*args): self.mylist = [x for x in args] self.count={}.fromkeys(range(len(self.mylist)),0) print(self.mylist) def __len__(self): return len(self.mylist) def __getitem__(self,key): self.count[key]+=1 return self.mylist[key] def
__setitem__(self,key,value): self.mylist[key]=value def __delitem__(self,key): self.mylist.remove( self.mylist[key]) del self.count[key] def append(self,value): self.mylist.append(value) self.count[len(self.mylist)-1]=0 def counter(self, key): return self.count[key] def pop(self): self.mylist.pop() self.count.pop(len(self.count)-1) def insert(self,index,value): keys=[] values=[] self.mylist.insert(index,value) for each_key in self.count.keys(): keys.append(each_key) keys.insert(index,index) for i in range(index+1,len(self.mylist)): keys[i]+=1 for i in range(len(keys)): self.count[keys[i]]=0 def clear(self): self.mylist.clear() self.count.clear() def reverse(self): keys=[] values=[] self.mylist.reverse() for each_key in self.count.keys(): keys.append(each_key) for each_val in self.count.values(): values.append(each_val) keys.reverse()#直接調用方法不能加等號 values.reverse()#直接調用方法不能加等號 self.count.clear() for i in range(len(keys)): self.count[keys[i]]=values[i]

Python3 魔法方法:定制序列