我正在尝试将类方法分配给类属性,以便我可以从字符串调用这些方法。使用该类时,我想从字符串中调用它,例如:
A.MAP['add'](x, y)
A.MAP['subtract'](x, y)
这是我当前的代码:
class A:
MAP = {
'add' : A.add(x, y),
'subtract' : A.subtract(x, y),
}
@classmethod
def add(cls, x, y)
return x + y
@classmethod
def subtract(cls, x, y)
return x - y
但是结果显示错误 A is not defined
在分配 A.add
的行至MAP['add']
。对于简短的功能,我可以使用 lambda
。但是,如果功能较长,如何实现这样的设计呢?
最佳答案
请注意,当您尝试时:
class A:
MAP = {
'add' : A.add(x, y),
'subtract' : A.subtract(x, y),
}
您正在尝试访问,例如A.add
在名称 A
存在之前(该类在定义完成之前不会绑定(bind)到该名称)并且在名称 add
存在之前(您还没有定义该方法)。类定义顶层的所有内容都是按顺序完成的。
定义类之后,您需要将类方法放入字典中(在定义完成之前,它们不会被调用):
class A:
MAP = {}
@classmethod
def add(cls, x, y): # note colon
return x + y
@classmethod
def subtract(cls, x, y): # also here
return x - y
A.MAP['add'] = A.add
A.MAP['subtract'] = A.subtract
请注意,由于两个类方法都不使用 cls
,因此您可以将它们设为@staticmethod
。或者只使用函数 - Python 不是 Java,您不需要将所有内容放入类中。
或者,您可以使用 getattr
按名称访问属性(包括类方法):
>>> class A:
@classmethod
def add(cls, x, y):
return x + y
@classmethod
def subtract(cls, x, y):
return x - y
>>> getattr(A, 'add')(1, 2)
3
关于python - 如何将类方法分配给类属性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30052961/