擅长:python、mysql、java
<p>将方法的第一个参数命名为<code>cls</code>或<code>self</code>只是一个约定</em>。<code>__call__</code>方法<em>没有自变量,只是在这里它的名称是<em>的</em><code>cls</code>。这是因为对于元类,方法是绑定到类对象的,其名称反映了这一点。在</p>
<p>同样的约定也适用于<code>@classmethod</code>方法;第一个参数总是一个类,这是由于<code>classmethod</code>对象是如何绑定的,因此将第一个参数命名为<code>cls</code>是有意义的。在</p>
<p>但你可以随意给第一个论点起其他名字。它不是使类方法、常规方法或元类型上的方法工作的名称。使用<code>self</code>或<code>cls</code>所做的就是<em>记录这是什么类型的对象,这样其他开发人员就更容易在心里跟踪正在发生的事情。在</p>
<p>所以不,这不是一个隐式类方法。第一个参数没有绑定到<code>Singleton</code>元类对象,而是绑定到被调用的类。这是有意义的,因为类对象是<code>Singleton</code>元类型的一个实例。在</p>
<p>如果您想深入研究<em>绑定的工作原理(不管名称是什么,都可以传入第一个参数的过程),您可以阅读<a href="https://docs.python.org/3/howto/descriptor.html" rel="noreferrer"><em>Descriptor HOWTO</em></a>。TLDR:functions、<code>property</code>、<code>classmethod</code>和<code>staticmethod</code>对象都是<em>描述符</em>,每当您将它们作为支持对象(如实例或类)的属性访问时,它们都是绑定的,通常会导致返回一个<em>不同的</em>对象,当调用时,这些对象会将绑定对象传递给实际函数。在</p>