运行 如何从 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
在这种情况下,您的 add
、minus
等方法可以是静态的,因此不需要 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)
会起作用。
那么,有没有一种方法可以定义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
在这种情况下,您的 add
、minus
等方法可以是静态的,因此不需要 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)
会起作用。