__len__(self):返回数值类型的结果,以表示容器的长度。该方法在可变容器和不可变容器中必须实现。
__getitem__(self, key):定义获取容器中指定元素的行为,相当于 self[key];当你执行 container[key] 的时候,调用的就是该方法。该方法在可变容器和不可变容器中也都必须实现。调用的时候,如果 key 的类型错误,该方法应该抛出TypeError;如果没法返回 key 对应的数值时,该方法应该抛出ValueError。注:key 可以是索引(index)
__setitem__(self, key, value):定义设置容器中指定元素的行为,相当于 self[key] = value;当你执行 self[key] = value 时,调用的是该方法。
__delitem__(self, key):定义删除容器中指定元素的行为,相当于 del self[key];当你执行 del self[key] 的时候,调用的是该方法。
__iter__(self):该方法需要返回一个迭代器(iterator)。当你执行 for x in container: 或者使用iter(container) 时,该方法被调用。
__reversed__(self):定义当被 reversed() 调用时的行为;如果想要该数据结构被內建函数 reversed() 支持,就还需要实现该方法。
__contains__(self, item):定义当使用成员测试运算符(in 或 not in)时的行为;如果定义了该方法,那么在执行 item in container 或者 item not in container 时该方法就会被调用。如果没有定义,那么Python会迭代容器中的元素来一个一个比较,从而决定返回True或者False。
__missing__(self, key):dict字典类型会有该方法,它定义了 key 如果在容器中找不到时触发的行为。比如d = {‘a’: 1}, 当你执行 d[notexist] 时,d.__missing__(‘notexist’)就会被调用。
现以构造自定义类型对象(即容器container)为例:
enumerate(container)返回索引与数值, 即 index 与 container[index], 所以你得在你的__getitem__(self, key):中定义好 container[index] 的返回值,其中 key(index) 可以是参数。
class Con: 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) c = Con([0, 1, 2, 3,4]) for i, data in enumerate(c): print(data)
注:之所以没实现 __iter__(self):方法是因为 enumerate( c ) 中的 c 是一个可遍历对象,如果要想把 c 变成一个可迭代对象,还得实现 __iter__(self):方法。
Python中的魔法方法_AFeng521web-CSDN博客_魔法方法
(十二)Python:常见魔法方法_带翅膀的猫的博客-CSDN博客