运行 如何从 python class 中的字典中自引用方法?

How to run self referenced method from dictionary in python class?

那么,有没有一种方法可以定义lambda函数的自引用字典,可以用来根据键调用不同的方法? 考虑一个小例子是什么意思?

class A:
    d = {
        "add": lambda p1, p2: self.add(p1, p2),
        "minus": lambda p1, p2: self.minus(p1, p2),
        "multiply": lambda p1, p2: self.multiply(p1, p2),
        "divide": lambda p1, p2: self.divide(p1, p2)
    }
    def add(self, p1, p2):
        return p1+p2
    def minus(self, p1, p2):
        return p1-p2
    def multiply(self, p1, p2):
        return p1*p2
    def divide(self, p1, p2):
        return p1/p2

如果我尝试以下操作:

a = A()
a.d["add"](1,2)

上面一行抛出错误:

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "<stdin>", line 3, in <lambda>
NameError: name 'self' is not defined

处理此问题的最佳方法是什么?

如果你想让字典中的函数绑定到实例,那么你需要一个字典per instance,所以字典需要在[=12]中初始化=] 方法。你现在拥有它的方式,你的字典是一个 class 属性,所以你有一个由所有实例共享的字典,并且它在声明 class 时初始化,这是在任何实例存在之前。

class A:
    def __init__(self):
        self.d = {
            "add": lambda p1, p2: self.add(p1, p2),
            "minus": lambda p1, p2: self.minus(p1, p2),
            "multiply": lambda p1, p2: self.multiply(p1, p2),
            "divide": lambda p1, p2: self.divide(p1, p2),
        }
    def add(self, p1, p2):
        return p1+p2
    def minus(self, p1, p2):
        return p1-p2
    def multiply(self, p1, p2):
        return p1*p2
    def divide(self, p1, p2):
        return p1/p2

请注意,如果您只需要绑定方法,则不需要使用 lambda 函数;你可以直接引用绑定的方法,像这样:

class A:
    def __init__(self):
        self.d = {
            "add": self.add,
            "minus": self.minus,
            "multiply": self.multiply,
            "divide": self.divide,
        }
    ...
    # the rest is the same

在这种情况下,您的 addminus 等方法可以是静态的,因此不需要 A 的实例,因此您的 lambda 将是 "add": lambda p1, p2: A.add(p1, p2), 等等:

class A:
    d = {
        "add": lambda p1, p2: A.add(p1, p2),
        "minus": lambda p1, p2: A.minus(p1, p2),
        "multiply": lambda p1, p2: A.multiply(p1, p2),
        "divide": lambda p1, p2: A.divide(p1, p2)
    }

    @staticmethod
    def add(p1, p2):
        return p1+p2

    @staticmethod    
    def minus(p1, p2):
        return p1-p2

    @staticmethod
    def multiply(p1, p2):
        return p1*p2

    @staticmethod
    def divide(p1, p2):
        return p1/p2

由于您的 d 字典是静态的(class 字段),您无法调用实例方法。如果您在 A:

__init__ 中初始化它,则可以
class A:
    def __init__(self):
        self.d = {
            "add": lambda p1, p2: self.add(p1, p2),
            "minus": lambda p1, p2: self.minus(p1, p2),
            "multiply": lambda p1, p2: self.multiply(p1, p2),
            "divide": lambda p1, p2: self.divide(p1, p2)
        }
    def add(self, p1, p2):
        return p1+p2

    def minus(self, p1, p2):
        return p1-p2

    def multiply(self, p1, p2):
        return p1*p2

    def divide(self, p1, p2):
        return p1/p2

在这两种情况下

a = A()
a.d["add"](1,2)

会起作用。