协议(Protocols) 与其他编程语言中的接口很相似,它规定你哪些方法必须要定义。然而,在Python中的协议就显得不那么正式。事实上,在Python中,协议更像是一种指南。
# 不可变容器 只需要定义__len__和__getitem__方法
class CountList:
def __init__(self, *args):
self.values = [x for x in args]
self.map = {}.fromkeys(range(len(self.values)), 0)
def __len__(self, other):
return len(self.valsues)
def __getitem__(self, item):
self.map[item] += 1
return self.values[item]
c1 = CountList(1, 3, 5, 7, 9)
print(c1[0])
# 结果 ==》1
print(c1.map)
# 结果 ==》{0: 1, 1: 0, 2: 0, 3: 0, 4: 0}
# 可变容器 需要定义__len__ __getitem__ __setitem__ __delitem__
class ChangeCountList:
def __init__(self, *args):
self.values = [x for x in args]
self.map = {}.fromkeys([x for x in args], 0)
def __len__(self, other):
return len(self.valsues)
def __getitem__(self, item):
self.map[self.values[item]] += 1
return self.values[item]
def __setitem__(self, key, value):
print('__setitem__', key, value)
self.values.append(value)
self.map[value] = 0
def __delitem__(self, key):
print('__delitem__', key)
self.values.remove(key)
self.map.pop(key)
c1 = ChangeCountList(1, 3, 5, 7, 9)
print(c1[0]) # 结果 ==》1
c1[5] = 10 # 自动调用 __setitem__ key = 5 value = 10
print(c1.values) # 结果 ==》[1, 3, 5, 7, 9, 10]
print(c1.map) # 结果 ==》 {1: 1, 3: 0, 5: 0, 7: 0, 9: 0, 10: 0}
del c1[1] # 自动调用 __delitem__ key = 1
print(c1.values) # [3, 5, 7, 9, 10]
print(c1.map) # {3: 0, 5: 0, 7: 0, 9: 0, 10: 0}
print(c1[1]) # 结果 ==》5
print(c1.map) # {3: 0, 5: 1, 7: 0, 9: 0, 10: 0}