擅长:python、mysql、java
<p>马丁的回答说明了一切。我加上这一点,也许不同的措辞可以给不同的人带来更多的启示:</p>
<h2>Python<strong>调用</strong>()这是一个隐式类方法吗?在</h2>
<p>不是。但是所有的“元类”方法都是使用该元类的类的隐式“类方法”。在</p>
<p>当我们考虑到类只是元类的实例时,这是隐含的。从语言的角度来看,一个类的行为与任何其他实例几乎完全相同,而且与一个类的任何交互都会触发对象中的dunder(<code>__magic__</code>)方法,比如使用“+,-,*,/”运算符,或使用<code>[ ]</code>进行索引检索,或者用<code>( )</code>调用它们,都会触发其类上相应的方法。通常是{<cd4>}。在</p>
<p>而且,正如另一个答案所说的,Python不关心在方法的第一个参数上使用什么名称。对于元类,使用<code>cls</code>是有意义的,因为方法处理的“实例”是元类。元类<code>__new__</code>方法的第一个参数命名为<code>metacls</code>(如下面的示例所示)。因为新的“cls”是我们在调用<code>type.__new__</code>后得到的对象,这是纯Python中唯一可能实际创建类对象的调用。在</p>
<pre><code>class Meta(type):
def __new__(metacls, name, bases, namespace):
...
cls = super().__new__(metacls, name, bases, namespace)
...
return cls
</code></pre>
<p>(现在,仍然是关于这个问题的主题:<code>__new__</code><strong>是一个特例吗
对于一个隐式静态方法(即使对于不打算成为元类的普通类也是如此),Python特别向其添加第一个参数,使用的机制与对正则的<code>classmethod</code>s所做的不同。这就是为什么上面的<code>super().__new__</code>调用需要将metals作为第一个参数包含在内)</p>