qux被视为一个实例方法,因为这是看起来像函数的类成员的默认处理(更具体地说,当你看它时,Baz.qux有一个__get__被隐式调用以“绑定”第一个参数到实例通过实例).但是,您没有在开始时提供自我参数.因此,baz被绑定到x lambda参数.
Python中的“self”这个名字并不神奇;这只是惯例.方法绑定始终通过绑定到函数的第一个参数来工作.
如果你聪明的话,你可以亲眼看到这个:
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'
一种解决方案是明确地将qux设为静态方法,如Sven Marnach的答案. (你也可以把它变成一个类方法,这是一个特定于Python的概念,它更强大; staticmethod更接近于像Java这样的语言中static static关键字的行为.)注意,就像在Java中一样,你也可以访问static方法foo中的self.qux.这可以通过用staticmethod安装的新机器替换普通的__get__机器来实现.
另一种解决方案是在lambda参数中提供self参数.如果你实际上不想要“静态”行为(即需要实际对自己做某事),这很有用 – 但它看起来就像你做的那样.为了完整起见,这看起来像:
qux = lambda self, x: x + '_quux'
def foo(self):
return self.qux('foo')