在Python中使用参数调用对象的方法
我希望能够使用动态函数名在Python类上调用不同的方法,例如在Python中使用参数调用对象的方法,python,reflection,methods,Python,Reflection,Methods,我希望能够使用动态函数名在Python类上调用不同的方法,例如 class Obj(object): def A(self, x): print "A %s" % x def B(self, x): print "B %s" % x o = Obj() # normal route o.A(1) # A 1 o.B(1) # B 1 # dynamically foo(o, "A", 1) # A 1; equiv. to o.A(1)
class Obj(object):
def A(self, x):
print "A %s" % x
def B(self, x):
print "B %s" % x
o = Obj()
# normal route
o.A(1) # A 1
o.B(1) # B 1
# dynamically
foo(o, "A", 1) # A 1; equiv. to o.A(1)
foo(o, "B", 1) # B 1
什么是“福”?(或者有其他方法吗?)。我已经查看了中的getattr
、apply
,以及其他内容。这是一个如此简单的参考问题,但唉,我来了
谢谢你的阅读 嗯,
getattr
似乎确实是你想要的:
getattr(o, "A")(1)
相当于
o.A(1)
Python中的方法是一级对象
getattr(o, 'A')(1)
有没有一种方法可以做同样的事情,只是用类名而不是方法名?例如,
getClass(“MyClassName”)
然后在此对象上使用getattr()
方法来获取其中的方法?@Tareck117:您可以使用globals()[“MyClass”]
在当前模块的全局范围内查找名称,或者getattr(某些模块,“MyClass”)
(如果它位于不同的模块中)。也就是说,在大多数(~99%)的情况下,我看到人们使用类名或变量名作为数据,他们的设计有问题。谢谢@Sven,我想这会对我有所帮助,但既然你认为我可能有设计问题,我会自我解释(我来自ASP/C的视角):我想调用Python Web服务(CheeryPy)通过javascript中的一些$.ajax调用,通过传递要执行的控制器的名称和要在控制器中调用的方法的名称来创建某种路由器。你知道一种更简洁的方法吗?另外,使用getattr(o,“a”)(1)
call从字符串参数调用方法是一种不好的做法吗?@Tareck117:没有上下文很难知道。globals()
和getattr()
都有有效的用法,但两者也经常被滥用。我的感觉是,globals()
的大多数用法都值得怀疑。永远不要将字符串文本作为第二个参数使用getattr()
——在这种情况下使用普通参数访问。