是否有一种方法可以自动将self传递给类中的lambda函数?我知道我可以在__init__
函数中传递self但是我要为Parser
的每个实例重新定义token_functions
。token_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')}