定制序列
协议(Protocols) 与其他编程语言中的接口很相似 , 他规定你哪些方法必须要定义. 然而在Python中的协议就显得不是那么的正式 . 事实上 , 在Python 中协议更像是一种指南 .
如果你希望自己定制的容器是不可变的话 , 你只需要定义 __len__()和__getitem__() 方法. (定义长度和 取出就行)
如果希望定制的容器是可变的话,你就需要再定义__setitem__()和__delitem__(两种方法.)
1 # 定制一个不可改变的列表 并且记录每个元素的访问次数 . 2 class CountList: 3 def __init__(sef,*args): # 参数的数量可变. 4 self.values=[x for x in args] # 列表推导式 5 self.count={}.fromkeys(range(len(self.values)),0) 6 7 def __len__(self): 8 return len(self.values) 9 10 def __getitem__(self,key): 11 self.count[key]+=1 12 return self.values[key] 13 14 # 很巧妙的办法. 至少对于现在的我 看看这个收获还是可以的. 15 16 # 类中有两个属性 一个是 value(列表) 一个是count(集合) 17 18 # 当调用类 的时候的顺序 进入value , 并且这些元素的顺序符号进入count 并且打上 0的标记 19 20 # 如果需要长度的话 就看value的长度就行 21 22 # 如果需要元素的话 传入序号就行 , 传入序号的时候 将集合中该序号对应的 值 +1
1 =============== RESTART: C:/Users/Administrator/Desktop/new.py =============== 2 >>> c1=CountList(1,3,5,7,9) 3 >>> c2=CountList(2,4,6,8,10) 4 >>> c1 5 <__main__.CountList object at 0x02EA99F0> 6 >>> c1[1] 7 3 8 >>> c1.values 9 [1, 3, 5, 7, 9] 10 >>> c1.count 11 {0: 0, 1: 1, 2: 0, 3: 0, 4: 0} 12 >>> c1[1] 13 3 14 >>> c1[1] 15 3 16 >>> c1.count 17 {0: 0, 1: 3, 2: 0, 3: 0, 4: 0} 18 >>>