从某种意义上来说,元类只是扩展了装饰器的代码插入模式。函数和类装饰器允许我们拦截并扩展函数调用以及类实例创建调用。那么,元类允许我们拦截并扩展类创建——它们提供了一个API以插入在一条class语句结束时运行的额外逻辑。

元类为各种没有它而难以实现或不可能实现的编码模式打开了大门,并且对于那些追求编写灵活的API或编程工具供其他人使用的程序猿来说,非常有用!

1.内省属性

像__class__和__dict__这样的特殊属性,允许我们查看Python对象内部的实现方面,以便更广泛的处理它们,列出对象的所有属性、显示一个类名等等。

2.运算符重载方法

像__str__和__add__这样特殊命名的方法,在类中编写来拦截并提供应用于类实例的内置操作的行为,列如打印、表达式运算等。它们自动运行作为对内置操作的响应。

3.属性拦截方法

一类特殊的运算符重载方法提供了一种方法,在实例上广泛地拦截属性访问:__getattr__、__setattr__、和__getattribute__允许包装的类插入自动运行的代码,这些代码可以验证属性请求,并且将它们委托给嵌入的对象。

4.类特性

内置函数property允许我们呢把代码和特殊的类属性关联起来,当获取、赋值或删除该属性的时候就自动运行代码。

5.类属性描述符

描述符允许我们在单独的类中编写__get__、__set__、和__delete__处理程序方法,当分配给该类的一个实例的属性被访问的时候自动运行它们。

6.函数和类装饰器

装饰器的特殊的@可调用语法,允许我们添加当调用一个函数或创建一个类实例的时候自动运行的逻辑。这个包装器逻辑可以跟踪或计时调用,验证参数,管理类的所有实例等。

元类是这些技术的延后——它们允许我们在一条class语句的末尾,插入当创建一个类对象的时候自动运行的逻辑。这个逻辑不会把类名重新绑定到一个装饰器可调用对象,而是把类自身的创建指向特定的逻辑。

发表评论

后才能评论