在Python中调用带有参数的对象方法

18

我希望能够使用动态函数名在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)
foo(o, "B", 1) # B 1

什么是"foo"?(或者有其他方法吗?)我确定它一定存在,但我似乎找不到它或记不起它叫什么。我已经查看了内置函数列表中的getattrapply和其他函数。这是一个如此简单的参考问题,但是我还是无法解决!

感谢阅读!

2个回答

45

嗯,getattr 确实是你想要的:

getattr(o, "A")(1)

等价于

o.A(1)

1
有没有一种方法可以从类名而不是方法名来做同样的事情?例如,getClass("MyClassName") 然后在这个对象上使用 getattr() 方法来获取其中的一个方法? - RPDeshaies
@Tareck117:您可以使用globals()["MyClass"]在当前模块的全局范围内查找名称,或者如果它在另一个模块中,则可以使用getattr(some_module, "MyClass")。话虽如此,在我看来,99%的情况下,当人们将类或变量名称用作数据时,他们的设计存在问题。 - Sven Marnach
谢谢@Sven,我想这会对我有所帮助,但既然你认为我可能存在设计问题,我会解释一下自己的想法(我来自ASP/C#的角度):我想通过一些$.ajax调用javascript来调用Python Web服务(CheeryPy),通过传递要执行的控制器名称和要调用的控制器中的方法名称来创建某种路由。你知道更干净的做法吗? - RPDeshaies
还有,使用getattr(o, "A")(1)调用从字符串参数调用方法是不好的做法吗? - RPDeshaies
@Tareck117:没有上下文很难知道具体情况。globals()getattr()都有合理的使用场景,但也经常被滥用。我认为大多数使用globals()的情况都是值得怀疑的。在使用getattr()时,永远不要将字符串字面量作为第二个参数--在这种情况下,请使用普通的参数访问方式。 - Sven Marnach

8

Python中的方法是一等公民对象。

getattr(o, 'A')(1)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接