python基础第9章 魔法方法、属性和迭代器(一)

__getitem__和__setitem__:

这个方法返回与指定键想关联的值。对序列来说,键应该是0~n-1的整数,其中n为序列的长度。对映射来说,键可以是任何类型。

class A :

  __getitem__:

    print(x)

实例化 a = A(),则a[y]就会调用这个方法

def checkIndex(key):
    """
    所给的键是能接受索引吗?

    为了能被接受,键应该是一个非负的整数。如果她不是一个整数,会引发TypeError;
    如果他是负数,则会引发IndexError(因为序列是无限长的)
        """
    if not isinstance(key, (str,int)):raise TypeError
    if key < 0:raise IndexError

class ArithmeticSequence:
    def __init__(self, start=0, step=1):
        """
        初始化算术序列

        起始值-序列中的第一个值
        步长-两个相邻之间的差别
        改变-用户修改值的字典
        """
        self.start = start  #保存开始值
        self.step =step     #保存步长值
        self.changed = {}   #没有项被修改
    def __getitem__(self,key):
        """
        Get an item from the arithmetic sequence,
     这个方法在使用是x[key]模式时会被触发, """ checkIndex(key) try: return self.changed[key] #修改了吗 except KeyError: #否则 return self.start + key*self.step #...计算值 def __setitem__(self, key, value): """ 修改算术序列中的一个项
      这个方法在x[key]=时候被触发 """ checkIndex(key) self.changed[key] = value # 保存修改后的值 
'''
总结:
1、魔法方法python内嵌实现特定功能的
2、魔法方法的触发不是常规触发,而是特殊的动作,如__init__是类初始化时触发,而上述是在直接[key]引用或者赋值时是触发
'''
posted @ 2019-05-28 16:33  klandehu  阅读(239)  评论(0)    收藏  举报