首页 > 代码库 > 魔法方法之自定义序列

魔法方法之自定义序列

自定义序列

  自定义序列的相关魔法方法允许我们自己创建的类拥有序列的特性,让其使用起来就像 python 的内置序列(dict,tuple,list,string等)。

  因为如果要定制容器类型的话需要用到这些协议。首先,实现不变容器的话有一个协议:实现不可变容器,你只能定义__len__ 和 __getitem__ (一会会讲更多)。可变容器协议则需要所有不可变容器的所有另外还需要 __setitem__ 和 __delitem__ 。最终,如果你希望你的对象是可迭代的话,你需要定义 __iter__ 会返回一个迭代器。迭代器必须遵循迭代器协议,需要有 __iter__ (返回它本身) 和 next 。 

容器背后的魔法方法

  • __len__(self)

    返回容器的长度,可变和不可变类型都需要实现。

  • __getitem__(self, key)

    定义对容器中某一项使用 self[key] 的方式进行读取操作时的行为。这也是可变和不可变容器类型都需要实现的一个方法。它应该在键的类型错误式产生 TypeError 异常,同时在没有与键值相匹配的内容时产生 KeyError 异常。

  • __setitem__(self, key)

    定义对容器中某一项使用 self[key] 的方式进行赋值操作时的行为。它是可变容器类型必须实现的一个方法,同样应该在合适的时候产生 KeyError 和 TypeError 异常。

  • __iter__(self, key)

    它应该返回当前容器的一个迭代器。迭代器以一连串内容的形式返回,最常见的是使用 iter()函数调用,以及在类似 for x in container: 的循环中被调用。迭代器是他们自己的对象,需要定义 __iter__ 方法并在其中返回自己。

  • __reversed__(self)

    定义了对容器使用 reversed() 内建函数时的行为。它应该返回一个反转之后的序列。当你的序列类是有序时,类似列表和元组,再实现这个方法,

  • __contains__(self, item)

    __contains__ 定义了使用 in 和 not in 进行成员测试时类的行为。你可能好奇为什么这个方法不是序列协议的一部分,原因是,如果 __contains__ 没有定义,Python就会迭代整个序列,如果找到了需要的一项就返回 True 。

  • __missing__(self ,key)

    __missing__ 在字典的子类中使用,它定义了当试图访问一个字典中不存在的键时的行为(目前为止是指字典的实例,例如我有一个字典 d , “george” 不是字典中的一个键,当试图访问d[“george’] 时就会调用 d.__missing__(“george”) 

example:

class FunctionalList:    ‘‘‘一个列表的封装类,实现了一些额外的函数式    方法,例如head, tail, init, last, drop和take。‘‘‘    def __init__(self, values=None):        if values is None:            self.values = []        else:            self.values = values    def __len__(self):        return len(self.values)    def __getitem__(self, key):        # 如果键的类型或值不合法,列表会返回异常        return self.values[key]    def __setitem__(self, key, value):        self.values[key] = value    def __delitem__(self, key):        del self.values[key]    def __iter__(self):        return iter(self.values)    def __reversed__(self):        return reversed(self.values)    def append(self, value):        self.values.append(value)    def head(self):        # 取得第一个元素        return self.values[0]    def tail(self):        # 取得除第一个元素外的所有元素        return self.valuse[1:]    def init(self):        # 取得除最后一个元素外的所有元素        return self.values[:-1]    def last(self):        # 取得最后一个元素        return self.values[-1]    def drop(self, n):        # 取得除前n个元素外的所有元素        return self.values[n:]    def take(self, n):        # 取得前n个元素        return self.values[:n]

 参考:http://pycoders-weekly-chinese.readthedocs.io/en/latest/issue6/a-guide-to-pythons-magic-methods.html#id14

魔法方法之自定义序列