Python类中动态赋值Lambda为实例方法时self参数未传递的解决办法
问题原因与解决方案
为什么c().m1()会报错?
类层面定义的方法(比如m2或者_m3)会被Python自动处理成绑定方法,调用时会自动把实例作为第一个参数(也就是self)传入。但在__init__里直接给self.m1赋值的lambda只是个普通函数,Python不会自动帮它绑定实例,所以调用时需要手动传self,用c().m1()的语法没传参数就会报错。
解决方法
方法1:lambda不声明self参数,直接引用__init__里的self
__init__中的self就是当前实例,lambda可以直接使用这个作用域内的变量,不需要额外声明参数:
class c: def __init__(self): self.m1 = lambda: 1 # 无需定义self参数 self.m3 = self._m3 m2 = lambda self: 1 def _m3(self): pass c().m1() # 正常执行,返回1
方法2:用types.MethodType将lambda包装为绑定方法
如果lambda需要访问实例的属性或方法,必须用到self参数,可以用types模块的MethodType把lambda绑定到当前实例,让Python自动传入self:
import types class c: def __init__(self): # 绑定lambda到当前实例 self.m1 = types.MethodType(lambda self: self.__class__.__name__, self) self.m3 = self._m3 m2 = lambda self: 1 def _m3(self): pass print(c().m1()) # 输出'c',正常执行
内容的提问来源于stack exchange,提问作者Wouter van Ooijen
相关产品推荐
相关产品推荐

