首页 > 解决方案 > 在 Python 中延迟包含关键字 self 的评估

问题描述

作为后续问题

在 Python 中延迟评估/延迟评估

我想延迟包含selfPython 中的关键字的评估。

最小工作示例:

class TestClass:

    def __init__(self, variable_0):
        self.__variable_0 = variable_0

    def get_variable_0(self):
        return self.__variable_0

    def test_delayed_evaluation(self, delayed_evaluation):
        print(delayed_evaluation)


delayed_evaluation_0 = lambda: self.get_variable_0()
test_class = TestClass(3)
test_class.test_delayed_evaluation(delayed_evaluation_0)  # Returns <function <lambda> at 0x0000024E49DE66A8>.
test_class.test_delayed_evaluation(delayed_evaluation_0())  # Returns NameError: name 'self' is not defined.

self我知道当我替换为时这段代码有效test_class,但是在我正在处理的项目中的(其他)代码中,类实例不是明确知道的,所以我不能使用这种方法。

为什么 Python 不识别self

标签: pythonlazy-evaluationdelayed-execution

解决方案


我不知道您到底要达到什么目的(即使阅读上一个问题);有一个更好的用例会很好。

为什么 Python 不识别self

因为它在被调用的那一刻没有定义;对于您的代码,您可以有效地使其与

delayed_evaluation_0 = lambda self: self.get_variable_0()
test_class.test_delayed_evaluation(delayed_evaluation_0(test_class))

我想你想要做的是这样的:

class TestClass:
    def __init__(self, variable_0):
        self.__variable_0 = variable_0

    def get_variable_0(self):
        return self.__variable_0

    def test_delayed_evaluation(self, delayed_evaluation):
        return getattr(self, delayed_evaluation)()

    def test_delayed_evaluation_with_parameters(self, delayed_evaluation, *args, **kwargs):
        lazy_func = getattr(self, delayed_evaluation)
        return lazy_func(*args, **kwargs)


test_case = TestClass(3)
test_case.test_delayed_evaluation('get_variable_0')

您可能还想functools.partial补充一些用例的知识,这些用例会比用lambda.


推荐阅读