python-魔法方法

发布时间:2022-08-19 13:04

__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)

python-魔法方法_第1张图片

注:之所以没实现 __iter__(self):方法是因为 enumerate( c ) 中的 c 是一个可遍历对象,如果要想把 c 变成一个可迭代对象,还得实现 __iter__(self):方法。

Python中的魔法方法_AFeng521web-CSDN博客_魔法方法

(十二)Python:常见魔法方法_带翅膀的猫的博客-CSDN博客

ItVuer - 免责声明 - 关于我们 - 联系我们

本网站信息来源于互联网,如有侵权请联系:561261067@qq.com

桂ICP备16001015号