在阅读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),但我找不到任何进一步的信息。
答案 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
)