擅长:python、mysql、java
<p><code>qux</code>被视为实例方法,因为这是看起来像函数的类成员的默认处理方式(更具体地说,<code>Baz.qux</code>有一个{<cd3>},当您通过实例查找时,它被隐式调用来将第一个参数“绑定”到实例)。但是,您在开始时没有提供<code>self</code>参数。相应地,<code>baz</code>被绑定到<code>x</code>lambda参数。在</p>
<p><strong>Python中“self”这个名字没有什么神奇之处;它只是约定。</strong>方法绑定总是通过绑定到函数的第一个参数来实现的。在</p>
<p>如果你聪明的话,你可以亲眼看到:</p>
<pre><code>class Baz(object):
qux = lambda x: x + '_quux'
def foo(self): return self.qux()
Baz().foo() # TypeError: unsupported operand type(s) for +: 'Baz' and 'str'
# because after binding Baz() to 'x', we get Baz() + '_quux'
</code></pre>
<p>一种解决方案是显式地使<code>qux</code>a<code>staticmethod</code>,如svenmarnach的答案所示。(您也可以将其设为<code>classmethod</code>,这是一个特定于Python的概念,功能更强大;<code>staticmethod</code>与Java等语言中的<code>static</code>关键字的行为非常相似。)请注意,与Java一样,您还可以在<code>foo</code>内将<code>staticmethod</code>作为<code>self.qux</code>来访问。这是通过用<code>staticmethod</code>安装的新机器来替换功能的正常<code>__get__</code>机器。在</p>
<p>另一种解决方案是在lambda参数中提供<code>self</code>参数。如果你真的不想要“静态”行为(即需要用<code>self</code>做点什么),这很有用,但看起来你确实需要这样做。为了完整起见,这看起来像:</p>
^{pr2}$