<p>类可以包含三种类型的方法:</p>
<ol>
<li><p>实例方法,例如</p>
<pre><code>def imethod(self,...): ...
</code></pre>
<p>这些只能在类的<em>实例</em>上调用,并且可以访问类和实例属性。第一个参数传统上称为<code>self</code>,在实例上调用时自动传递给方法:</p>
<pre><code>instance = Class()
instance.imethod(...)
</code></pre>
</li>
<li><p>类方法,例如</p>
<pre><code>@classmethod
def cmethod(cls,...): ...
</code></pre>
<p>这些可以在类本身或实例上调用,但只能访问类属性。第一个参数通常命名为<code>cls</code>,在类上调用时自动传递给方法:</p>
<pre><code>Class.cmethod(...)
instance.cmethod(...) # works, but can't access instance attributes.
</code></pre>
</li>
<li><p>静态方法,例如</p>
<pre><code>@staticmethod
def smethod(...): ...
</code></pre>
<p>这些函数与类相关,但无法访问实例或类属性,因此它们不会作为第一个参数传递给类或实例对象。可以在实例或类上调用它们:</p>
<pre><code>instance = Class()
Class.smethod(...)
instance.smethod(...)
</code></pre>
</li>
</ol>
<p>示例(Python 3.9):</p>
<pre><code>class Demo:
cvar = 1
def __init__(self,ivar):
self.ivar = ivar
@classmethod
def cmethod(cls):
print(f'{cls.cvar=}')
@staticmethod
def smethod():
print('static')
def imethod(self):
print(f'{self.cvar=} {self.ivar=}')
Demo.smethod()
Demo.cmethod()
instance = Demo(2)
instance.smethod()
instance.cmethod()
instance.imethod()
</code></pre>
<p>输出:</p>
<pre><code>static
cls.cvar=1
static
cls.cvar=1
self.cvar=1 self.ivar=2
</code></pre>
<p>在本例中,您定义了一个实例方法,但没有首先创建实例,因此您尝试传递的<code>int</code>参数被传递为<code>self</code>,并且在内部尝试访问整数<code>50</code>上的<code>actions</code>。首先创建一个实例,不要传递任何参数<code>self</code>将自动传递:</p>
<pre><code>compagnie = Compagnie('nom','actions','prix')
compagnie.setActions()
</code></pre>