56.python基本的序列和映射协议-类实例化当作字典使用
基本的序列和映射协议
类实例化当作字典使用,构造函数初始化参数
序列和映射基本上是元素(item)的集合,要实现它们的基本行为(协议),不可变对象需 要实现2个方法,而可变对象需要实现4个。
__len__(self):这个方法应返回集合包含的项数,对序列来说为元素个数,对映射来说 为键值对数。如果__len__返回零(且没有实现覆盖这种行为的__nonzero__),对象在布 尔上下文中将被视为假(就像空的列表、元组、字符串和字典一样)。
__getitem__(self, key):这个方法应返回与指定键相关联的值。对序列来说,键应该是 0~n 1的整数(也可以是负数,这将在后面说明),其中n为序列的长度。对映射来说, 键可以是任何类型。
__setitem__(self, key, value):这个方法应以与键相关联的方式存储值,以便以后能够 使用__getitem__来获取。当然,仅当对象可变时才需要实现这个方法。
__delitem__(self, key):这个方法在对对象的组成部分使用__del__语句时被调用,应 删除与key相关联的值。同样,仅当对象可变(且允许其项被删除)时,才需要实现这个 方法。 对于这些方法,还有一些额外的要求。
对于序列,如果键为负整数,应从末尾往前数。换而言之,x[-n]应与x[len(x)-n]等效。
如果键的类型不合适(如对序列使用字符串键),可能引发TypeError异常。
对于序列,如果索引的类型是正确的,但不在允许的范围内,应引发IndexError异常。 要了解更复杂的接口和使用的抽象基类(Sequence),
请参阅有关模块collections的文档。 下面来试一试,看看能否创建一个无穷序列
def check_index2(key): if not isinstance(key, int): raise TypeError if key < 0: raise IndexError class ArithmeticSequence: def __init__(self,start =0,step =1): self.start2 = start self.step2 = step self.changed2 = {} print('开始构造') def __getitem__(self, key): check_index2(key) print('查询结果') try: return self.changed2[key] except KeyError: print('出现异常。。。执行计算') return self.start2 + key * self.step2 def __setitem__(self, key, value): check_index2(key) print('设置结果') self.changed2[key] = value # Press the green button in the gutter to run the script. if __name__ == '__main__': print_hi('great day') s = ArithmeticSequence(1,2) print(s[5]) print(s[6]) s[4] = 2 print(s[4])
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
2023-01-10 QT error: unknown type name 'QModbusClient'
2020-01-10 opencv视频教程分享
2020-01-10 QT creator视频教程分享