[关闭]
@songying 2018-07-12T16:12:08.000000Z 字数 1590 阅读 857

自定义序列 -- 特殊方法

python特殊方法


在python中,自定义容器类型需要遵循一些协议:

  1. 对于不可变容器类型: 想实现一个不可变容器,你需要定义 __len____getitem__

  2. 对于可变容器, 除了上面提到的两个方法之外,还需要定义 __setitem____delitem__

  3. 如果你想让你的对象可以迭代,你需要定义 __iter__ ,这个方法返回一个迭代器。迭代器必须遵守迭代器协议,需要定义__iter__(返回它自己)和__next__ 方法。

__len__

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

  1. __len__(self)

内置函数len()就是调用该方法。

__getitem__

定义了该方法后就可以使用desk[0], desk[-1]了。

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

  1. __getitem__(self, key)

__setitem__

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

  1. __setitem__(self, key)

__contains__

__contains__定义了使用 in 和 not in 进行成员测试时类的行为。

你可能好奇为什么这个方法不是序列协议的一部分,原因是,如果 __contains__ 没有定义,Python就会迭代整个序列,如果找到了需要的一项就返回 True 。

  1. __contains__(self, item)

__delitem__

例子

  1. class FunctionalList:
  2. '''一个列表的封装类,实现了一些额外的函数式
  3. 方法,例如head, tail, init, last, drop和take。'''
  4. def __init__(self, values=None):
  5. if values is None:
  6. self.values = []
  7. else:
  8. self.values = values
  9. def __len__(self):
  10. return len(self.values)
  11. def __getitem__(self, key):
  12. # 如果键的类型或值不合法,列表会返回异常
  13. return self.values[key]
  14. def __setitem__(self, key, value):
  15. self.values[key] = value
  16. def __delitem__(self, key):
  17. del self.values[key]
  18. def __iter__(self):
  19. return iter(self.values)
  20. def __reversed__(self):
  21. return reversed(self.values)
  22. def append(self, value):
  23. self.values.append(value)
  24. def head(self):
  25. # 取得第一个元素
  26. return self.values[0]
  27. def tail(self):
  28. # 取得除第一个元素外的所有元素
  29. return self.valuse[1:]
  30. def init(self):
  31. # 取得除最后一个元素外的所有元素
  32. return self.values[:-1]
  33. def last(self):
  34. # 取得最后一个元素
  35. return self.values[-1]
  36. def drop(self, n):
  37. # 取得除前n个元素外的所有元素
  38. return self.values[n:]
  39. def take(self, n):
  40. # 取得前n个元素
  41. return self.values[:n]
添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注