python有像PHP这样的call_user_func()吗?

rub*_*eet 0 php python

python有像call_user_func()PHP 一样的功能吗?

PHP版本:

call_user_func(array($object,$methodName),$parameters)    
Run Code Online (Sandbox Code Playgroud)

如何在Python中实现上述功能?

Ste*_*202 8

我没有看到问题,除非methodName是一个字符串.在那种情况下,getattr完成这项工作:

>>> class A:
...     def func(self, a, b):
...         return a + b
... 
>>> a = A()
>>> getattr(a, 'func')(2, 3)
5
Run Code Online (Sandbox Code Playgroud)

如果object也是一个字符串,那么这将使用全局变量本地变量(但是你可能有其他更大的问题):

>>> getattr(locals()['a'], 'func')(2, 3)
5
>>> getattr(globals()['a'], 'func')(2, 3)
5
Run Code Online (Sandbox Code Playgroud)

编辑:重新澄清.要基于字符串初始化对象:

>>> class A:
...     def __init__(self): print('a')
... 
>>> class B:
...     def __init__(self): print('b')
... 
>>> clsStr = 'A'
>>> myObj = locals()[clsStr]()
a
Run Code Online (Sandbox Code Playgroud)

我不确定这是否真的是你想要的...除非你有很多不同的类,为什么不只是执行字符串匹配?


另一个编辑:虽然上面的工作,你应该认真考虑使用Ignacio Vazquez-Abrams提供的解决方案.首先,通过将所有可能的类存储在a中dict,可以避免因传递不正确的字符串参数而导致的奇怪行为,该字符串参数恰好与当前作用域中的非相关类的名称相匹配.