__init_subclass__并且
__set_name__是正交机制-
它们并不相互关联,只是在同一PEP中进行了描述。两者都是以前需要功能齐全的元类的功能。该PEP 487地址 2 元类最常见的用途:
- 如何让父母知道何时将其子类化(
__init_subclass__
) - 如何让描述符类知道用于(
__set_name__
)的属性的名称
正如PEP所说:
尽管有很多使用元类的方法,但 绝大多数用例可分为三类:在类创建后运行的一些初始化代码,描述符的初始化以及保持类属性定义的顺序。
通过对类的创建进行简单的挂钩,就可以轻松实现前两个类别:
- 一个
__init_subclass__钩子,用于初始化给定类的所有子类。- 创建
__set_name__类时,将对类中定义的所有属性(描述符)调用一个钩子,并且第三类是另一个PEP 520的主题。
还要注意,虽然
__init_subclass__可以替换在 此类 的继承树中使用元类,但是
__set_name__在 描述符类
中的替换是针对将 描述符 的实例 作为attribute 的类使用元类。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)