猿问

下列代码中,s = ArithmeticSequence(1,2)先调用的是哪个函数,setitem和getitem哪个先调用?

def check_index(key):
    '''
    检查指定的key是否是可接受的索引
    key必须是非负整数,才是可接受的。
    如果不是整数,将引发TypeError异常;
    如果是负数,将引发IndexError异常,因为这个序列是无穷的
    '''
    if not isinstance(key, int ):raise TypeError
    if key < 0: raise IndexError

class ArithmeticSequence:

    def __init__(self, start = 0, step = 1):
        '''
        初始化这个算术序列
        :param start: 指定第一个值,默认为0
        :param step: 指定两个相邻值的差,默认为1
        changed:一个字典,包含用户修改后的值
        '''
        self.start = start
        self.step = step
        self.changed = {}  # 空字典表示没有任何元素被修改

    def __setitem__(self,key,value):
        # 修改算术序列中的元素
        check_index(key)

        self.changed[key] = value # 储存修改后的值

    def __getitem__(self,key):
        # 从算术序列中获取一个元素
        check_index(key)
        try:
            return self.changed[key]
        except KeyError:
            '''
            在Python中,当你使用a[key]这种方式从字典中获取一个值时,若字典中不存在这个key时就会产生一个KeyError的错误
            '''
            return self.start + key * self.step

s = ArithmeticSequence(1,2)

print(s[4])


MADAO7
浏览 1640回答 4
4回答

李东岳

这个问题,其实你可以简单采用print调试一下就可以看得出。 1.类的实例化第一步调用init构造函数, 2.根据提供的参数会调用setitem.此时字典才实现赋值, 3.最后s4调用函数字典取数,这里面实现的魔术方法就是getitem

MADAO7

先调用init,s[4]调用getitem,最后调用setitem
随时随地看视频慕课网APP

相关分类

Python
我要回答