python中自定义序列和反射的魔法方法
自定义序列
为了让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中进行面向对象编程时很重要的一点:不管做什么事情,都会有一个简单方法,不管它常用不常用。