@songying
2018-07-12T16:12:08.000000Z
字数 1590
阅读 857
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 = 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]