擅长:python、mysql、java
<p>类定义中的额外命名参数被传递到类构造函数方法中,即元类<code>__new__</code>:</p>
<pre><code>In [1]: class M(type):
...: def __new__(metacls, name, bases, namespace, **kwargs):
...: print(f'At metaclass, {kwargs}')
...: return super().__new__(metacls, name, bases, namespace)
...:
In [2]: class A(metaclass=M, f="hello world"): pass
At metaclass, {'f': 'hello world'}
</code></pre>
<p>因此,自定义元类可能会利用它,甚至在Python3.6之前。但是n<a href="https://docs.python.org/3/reference/datamodel.html#object.__init_subclass__" rel="nofollow noreferrer">Python 3.6, the ^{<cd2>} addition</a>使它变得更简单,因此非常有用,因为不需要自定义元类。在</p>
<p>请注意,自定义类层次结构中的<code>__init_subclass__</code>方法负责最终调用<code>object.__init_subclass__</code>,后者不接受任何命名参数。因此,如果您要创建一个使用<code>__init_subclass__</code>的类层次结构,那么每个这样的方法都应该在调用<code>super().__init_subclass__</code>之前,通过从<code>kwargs</code>中删除它们来“消费”其特定的参数。来自<code>type</code>本身的<code>__new__</code>和<code>__init__</code>方法(默认元类)只是忽略任何命名的参数。在</p>