Python3 魔法方法:定制序列

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]

 

posted @ 2018-02-09 19:53  消灭猕猴桃  阅读(283)  评论(0编辑  收藏  举报