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])
欢迎讨论,相互学习。
cdtxw@foxmail.com