Python 中,像序列类型(如列表、元祖、字符串)或映射类型(如字典)都是属于容器类型,容器是可定制的。要想成功地实现容器的定制,我们需要先谈一谈协议。协议是什么呢?协议(Protocols)与其他编程语言中的接口很相似,它规定你哪些方法必须要定义。然而,在 Python 中的协议就显得不那么正式。事实上,在 Python 中,协议更像是一种指南。定制容器,那我们就必须要知道,定制容器有关的一些协议:Python魔法方法详解。
1. 如果说你希望定制的容器是不可变的话,你只需要定义 __len__() 和 __getitem__() 方法。
2. 如果你希望定制的容器是可变的话,除了 __len__() 和 __getitem__() 方法,你还需要定义 __setitem__() 和 __delitem__() 两个方法。
class CountList: def __init__(self, *args): self.values = [x for x in args] print(self.values) self.count = {}.fromkeys(range(len(self.values)),0) # 初始化一个字典,其键值为0到所传入参数个数减去1,且每个键的值默认为0,意思就是默认每个定制容器对象中的元素都没有被访问 def __len__(self): return len(self.values) def __getitem__(self, key): self.count[key] += 1 # 定制对象中的元素每被访问一次就记录一次 return self.values[key] >>> c1 = CountList(1,3,5,7,9) [1, 3, 5, 7, 9] >>> c2 = CountList(2,4,6,8,10) [2, 4, 6, 8, 10] >>> c1.count {0: 0, 1: 0, 2: 0, 3: 0, 4: 0} >>> len(c1.count) 5 >>> c1[1] 3 >>> c2[1] 4 >>> c1[1]+c2[1] 7 >>> c1.count {0: 0, 1: 2, 2: 0, 3: 0, 4: 0} >>> c2.count {0: 0, 1: 2, 2: 0, 3: 0, 4: 0} >>>