元类使用规范

在大型的面向对象程序中,有时将类定义置于元类的控制下会很有用。元类可以检查类的定义,并用于警告程序员可能未引起注意的潜在问题(例如,使用稍微不兼容的方法签名)。

有人可能会争辩说,程序分析工具或IDE可以更好地捕获此类错误。可以肯定的是,这样的工具是有用的。但是,如果您要创建供他人使用的框架或库,则通常无法控制他们的开发实践的严格性。因此,对于某些类型的应用程序,如果这样的检查会带来更好的用户体验,则可能需要对元类进行一些额外的检查。

在元类中重新定义__new __()或__init __()的选择取决于您要如何使用结果类。__new __()在类创建之前被调用,通常在元类想要以某种方式(通过更改类字典的内容)更改类定义时使用。 __init __()方法在创建类之后被调用,如果您要编写与完全形成的类对象一起工作的代码,该方法很有用。在最后一个示例中,这是必不可少的,因为它使用super()函数搜索先前的定义。这仅在创建类实例并设置了基础方法解析顺序(MRO)后才有效。

最后一个示例还说明了Python函数签名对象的用法。本质上,元类采用类中的每个可调用定义,搜索先前的定义(如果有),然后使用inspect.signature()简单地比较其调用签名。

最后但并非最不重要的一点是,使用super(self,self)的代码行不是错字。当使用元类时,重要的是要认识到self实际上是一个类对象。因此,该语句实际上用于查找位于构成自身父级的类层次结构中更远的定义。

posted @ 2020-03-01 12:55  Jeffrey_Yang  阅读(155)  评论(0编辑  收藏  举报