‘‘‘# str、 type 和 LineItem 是object 的子类 str、 object 和 LineItem 是 type 的实例,因为它们都是类object 类和 type 类之间的关系很独特: object 是 type 的实例,而 type是 object 的子类。这种关系很“神奇”,无法使用 Python 代码表述,因为定义其中一个之前另一个必须存在。 type 是自身的实例这一点也很神奇>>> ‘spam‘.__class__<class ‘str‘>>>> str.__class__<class ‘type‘>>>> from bulkfood_v6 import LineItem>>> LineItem.__class__<class ‘type‘>>>> type.__class__<class ‘type‘>‘‘‘ ‘‘‘ABCMeta 最终所属的类也是 type。所有类都直接或间接地是 type 的实例,不过只有元类同时也是 type 的子类。若想理解元类,一定要知道这种关系:元类(如ABCMeta)从 type 类继承了构建类的能力>>> import collections>>> collections.Iterable.__class__<class ‘abc.ABCMeta‘>>>> import abc>>> abc.ABCMeta.__class__<class ‘type‘>>>> abc.ABCMeta.__mro__(<class ‘abc.ABCMeta‘>, <class ‘type‘>, <class ‘object‘>)Iterable 是 object 的子类,是 ABCMeta 的实例。 object 和 ABCMeta 都是type 的实例,但是这里的重要关系是, ABCMeta 还是 type 的子类,因为 ABCMeta 是元类。示意图中只有 Iterable 是抽象类我们要抓住的重点是,所有类都是 type 的实例,但是元类还是 type 的子类,因此可以作为制造类的工厂。具体来说,元类可以通过实现 __init__ 方法定制实例。元类的__init__ 方法可以做到类装饰器能做的任何事情,但是作用更大,如接下来的练习所示。‘‘‘ #构建顺序:元类__prepare__() -> __new__() -> __init__()
时间: 2024-10-09 23:35:02