协议(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 >>>