在lambda函数中自动传递自我?



是否有一种方法可以自动将self传递给类中的lambda函数?我知道我可以在__init__函数中传递self但是我要为Parser的每个实例重新定义token_functionstoken_functions永远不会改变,所以这看起来效率很低。有更好的方法吗?

class Parser:
token_functions = {r'n': lambda: Parser.new_line(self)}
def __init__(self):
self.line_number = 0
Parser.token_functions[r'n']()

def new_line(self):
self.line_number += 1
print(self.line_number)

Parser()

No。由lambda表达式创建的函数不是类属性,因此不会触发描述符协议。

可以直接调用它的__get__方法,例如Parser.token_functions[r'n'].__get__(self, type(self))(),但是您可能不想直接处理底层机器。

只需定义函数接受带有new_line方法的对象作为显式参数,并在时机成熟时传递self

class Parser:
token_functions = {r'n': lambda obj: obj.new_line()}
def __init__(self):
self.line_number = 0
Parser.token_functions[r'n'](self)

def new_line(self):
self.line_number += 1
print(self.line_number)

operator模块提供了一个methodcaller函数来代替这种lambda表达式的使用。

token_functions = {'n': operator.methodcaller('new_line')}

最新更新