我正在尝试将类方法分配给class属性,因此我可以从string调用方法。当我使用类时,我想从字符串中调用它:
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
。但是,如果功能较长,我该如何实现这种设计?
答案 0 :(得分:2)
请注意,当您尝试:
class A:
MAP = {
'add' : A.add(x, y),
'subtract' : A.subtract(x, y),
}
您正试图访问,例如在名称A.add
存在之前A
(该类在定义完成之前未绑定到名称)并且在名称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
答案 1 :(得分:1)
请不要在python中编程,而是使用更标准的oop方法:
#!/usr/bin/env python
class A:
def __init__(self):
pass
@classmethod
def add(self, x, y):
return x + y
@classmethod
def subtract(self, x, y):
return x - y
if __name__ == "__main__":
a = A()
print a.add(1,2) # ans: 3
print a.subtract(2,1) # ans: 1