基类列表中的分配

时间:2019-02-15 09:45:39

标签: python python-3.x metaclass

在阅读typing模块源代码时,我注意到以下内容:

class _SpecialForm(_Final, _Immutable, _root=True):
    ...

在这里,作业位于基类列表中。

稍后,它已签入:

class _Final:
    def __init_subclass__(self, *args, **kwds):
        if '_root' not in kwds:
            raise TypeError("Cannot subclass special typing classes")

_root到底在哪里?文档将其称为“类关键字参数”(https://docs.python.org/3/reference/datamodel.html#object.init_subclass),但我找不到任何进一步的信息。

1 个答案:

答案 0 :(得分:1)

class关键字参数是在类声明中传递的任何kwyword参数。只有一个这样的参数具有特殊处理-metaclass=-该参数规定将用于提供元类的可调用对象。

任何其他关键字参数都按原样传递给元类__new____init__方法以及任何超类__init_subclass__方法。这些没有以特殊方式处理,最重要的是,它们不是“基类”-前面提到的方法通常会像任何Python方法一样接收这些关键字参数:它们可以在方法签名中声明,或者可以接受**kwargs字典(是这种情况)。

值得一提的是,在将“吞噬”它的超类中通过适当的__init_subclass__方法传递此类参数时,由于{{ 1}}的{​​{1}}。相反,TypeError类上的object__init_subclass__的默认元类实现只会忽略传递的所有额外关键字。

因此:

__new__

失败:

__init__

而:

type

工作正常。 (In [1]: class A(test=None): ...: pass ...: kwd将通过TypeError: __init_subclass__() takes no keyword arguments