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])

 

posted @ 2024-01-10 14:07  txwtech  阅读(12)  评论(0编辑  收藏  举报