@songying
2018-07-12T08:12:08.000000Z
字数 1590
阅读 1085
python特殊方法
在python中,自定义容器类型需要遵循一些协议:
对于不可变容器类型: 想实现一个不可变容器,你需要定义 __len__ 和 __getitem__
对于可变容器, 除了上面提到的两个方法之外,还需要定义 __setitem__ 和 __delitem__。
如果你想让你的对象可以迭代,你需要定义 __iter__ ,这个方法返回一个迭代器。迭代器必须遵守迭代器协议,需要定义__iter__(返回它自己)和__next__ 方法。
__len__返回容器的长度,可变和不可变类型都需要实现
__len__(self)
内置函数len()就是调用该方法。
__getitem__定义了该方法后就可以使用desk[0], desk[-1]了。
定义对容器中某一项使用 self[key] 的方式进行读取操作时的行为。这也是可变和不可变容器类型都需要实现的一个方法。
它应该在键的类型错误式产生 TypeError 异常,同时在没有与键值相匹配的内容时产生 KeyError 异常。
__getitem__(self, key)
__setitem__定义对容器中某一项使用 self[key] 的方式进行赋值操作时的行为。它是可变容器类型必须实现的一个方法,同样应该在合适的时候产生 KeyError 和 TypeError 异常。
__setitem__(self, key)
__contains____contains__定义了使用 in 和 not in 进行成员测试时类的行为。
你可能好奇为什么这个方法不是序列协议的一部分,原因是,如果 __contains__ 没有定义,Python就会迭代整个序列,如果找到了需要的一项就返回 True 。
__contains__(self, item)
__delitem__
class FunctionalList:'''一个列表的封装类,实现了一些额外的函数式方法,例如head, tail, init, last, drop和take。'''def __init__(self, values=None):if values is None:self.values = []else:self.values = valuesdef __len__(self):return len(self.values)def __getitem__(self, key):# 如果键的类型或值不合法,列表会返回异常return self.values[key]def __setitem__(self, key, value):self.values[key] = valuedef __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]
