擅长:python、mysql、java
<p>这样想:普通方法有助于隐藏分派的细节:您可以键入<code>myobj.foo()</code>,而不必担心<code>foo()</code>方法是由<code>myobj</code>对象的类还是其父类之一实现的。类方法与此完全类似,但与类对象相反:它们允许您调用<code>MyClass.foo()</code>,而不必担心<code>foo()</code>是否由<code>MyClass</code>特别实现,因为它需要自己的专用版本,或者它是否允许其父类处理调用。</p>
<p>当您在创建实际实例之前进行设置或计算时,类方法是必不可少的,因为在实例存在之前,您显然不能将实例用作方法调用的分派点。在SQLAlchemy源代码中可以看到一个很好的示例;请在以下链接中查看<code>dbapi()</code>类方法:</p>
<p><a href="https://github.com/zzzeek/sqlalchemy/blob/ab6946769742602e40fb9ed9dde5f642885d1906/lib/sqlalchemy/dialects/mssql/pymssql.py#L47" rel="noreferrer">https://github.com/zzzeek/sqlalchemy/blob/ab6946769742602e40fb9ed9dde5f642885d1906/lib/sqlalchemy/dialects/mssql/pymssql.py#L47</a></p>
<p>您可以看到,数据库后端使用<code>dbapi()</code>方法根据需要导入特定于供应商的数据库库,它是一个类方法,因为它需要在开始创建特定数据库连接的</em>实例之前运行<em>,但它不能是一个简单的函数或静态函数,因为他们希望它能够调用其他支持方法,这些方法可能同样需要在子类中比在父类中写得更具体。如果您分派到一个函数或静态类,那么您将“忘记”并失去关于哪个类正在进行初始化的知识。</p>