Python-定制容器

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

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容