擅长:python、mysql、java
<p><a href="https://stackoverflow.com/a/68149194/10426037">mikey's answer</a>是正确的,但让我们解释一下原因</p>
<p>正如回溯所说,<code>add</code>需要一个参数<code>self</code>。因此,无论何时调用<code>add</code>,都需要至少传递一个参数</p>
<p>在python中,这是在大多数典型情况下由解释器“秘密”完成的。在类内调用类方法时,您会执行以下操作:</p>
<pre><code>self.execute()
</code></pre>
<p>或者从类实例调用方法时:</p>
<pre><code>cpu_.execute()
</code></pre>
<p>在后台,解释器使用<code>self</code>或<code>cpu_</code>实例作为<code>execute</code>方法的第一个参数。<br/>
换句话说,<code>cpu_.execute()</code>是<code>cpu.execute(cpu_)</code>的语法糖,在这里,您从类对象调用一个方法,并将类的实例作为第一个参数传递</p>
<p>现在,当您这样做时:</p>
<pre><code>def execute(self):
self.instructions[0]()
</code></pre>
<p>这里您正在调用<code>instruction[0]</code>中引用的方法,但是由于该方法是在列表中定义的,因此不能使用语法糖。点前面没有<code>self</code>。当然,在<code>instructions</code>之前有<code>self</code>,但那是指<code>instructions</code>列表,而不是列表的内容。<br/>
因此必须显式地提供<code>self</code>参数</p>
<pre><code>self.instructions[0](self)
</code></pre>