注册 登录

清河洛

python中自定义序列和反射的魔法方法

qingheluo2018-11-23清河洛273
自定义序列为了让Python类表现得像是内建序列类型(字典,元组,列表,字符串等),让你的类与一系列的全局函数完美结合,进行正常的序列常用操作。__len__(self):返回长度。__getitem__(self, key):定义使用self[key]的方式进行读取操作时的行为。它应该在键的类型错误式产生TypeError异常,同时在没有与键值相匹配的内容时产生 KeyError 异常。__setitem__(self, key, value):定义使用self[key]=value的方式进行赋值操作时的行为。它应该在合适的时候产生 KeyError 和 TypeError 异常。__...

自定义序列

为了让Python类表现得像是内建序列类型(字典,元组,列表,字符串等),让你的类与一系列的全局函数完美结合,进行正常的序列常用操作。

__len__(self):返回长度。

__getitem__(self, key):定义使用self[key]的方式进行读取操作时的行为。它应该在键的类型错误式产生TypeError异常,同时在没有与键值相匹配的内容时产生 KeyError 异常。

__setitem__(self, key, value):定义使用self[key]=value的方式进行赋值操作时的行为。它应该在合适的时候产生 KeyError 和 TypeError 异常。

__delitem__(self, key):定义使用del self[key]语句时的行为

__iter__(self):如果想让对象可迭代,使用这个方法返回一个迭代器。最常见的是使用iter()函数调用,以及在for循环中被调用。

__next__(self): 定义了如果这个容器被转换为迭代器之后或者生成器generator之后使用next()方法获取下一个值的行为

__reversed__(self):定义了对容器使用reversed()(反转序列)内建函数时的行为。

__contains__(self, item):定义了使用 in 和 not in 进行成员测试时类的行为。

__missing__(self ,key):在字典的子类中使用,定义了当试图访问一个字典中不存在的键时的行为

下面的例子是创建一个类似list的类

class F:
    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)

反射

通过定义魔法方法来控制用于反射的内建函数isinstance和issubclass的行为。下面是对应的魔法方法:

__instancecheck__(self, instance)

检查一个实例是否是你定义的类的一个实例(例如 isinstance(instance, class) )。

__subclasscheck__(self, subclass)

检查一个类是否是你定义的类的子类(例如 issubclass(subclass, class) )。

这几个魔法方法的适用范围看起来有些窄,事实也正是如此,因为相比其他魔法方法它们显得不是很重要。但是它们展示了在Python中进行面向对象编程时很重要的一点:不管做什么事情,都会有一个简单方法,不管它常用不常用。



网址导航