python在PHP中是否有像call_user_func()
这样的函数?
PHP版本:
call_user_func(array($object,$methodName),$parameters)
如何在Python中实现上述目标?
答案 0 :(得分:8)
我没有看到问题,除非methodName
是一个字符串。在这种情况下getattr完成工作:
>>> class A:
... def func(self, a, b):
... return a + b
...
>>> a = A()
>>> getattr(a, 'func')(2, 3)
5
如果object
也是一个字符串,那么这可以使用globals或locals(但是您可能还有其他更大的问题):
>>> getattr(locals()['a'], 'func')(2, 3)
5
>>> getattr(globals()['a'], 'func')(2, 3)
5
修改:重新澄清。基于字符串初始化对象:
>>> class A:
... def __init__(self): print('a')
...
>>> class B:
... def __init__(self): print('b')
...
>>> clsStr = 'A'
>>> myObj = locals()[clsStr]()
a
我不确定这是否真的是你想要的...除非你有很多不同的类,为什么不只是执行字符串匹配?
另一个编辑:虽然上述工作正常,但您应该认真考虑采用Ignacio Vazquez-Abrams提供的解决方案。首先,通过在dict
中存储所有可能的类,可以避免因传递错误的字符串参数而导致的奇怪行为,该字符串参数恰好与当前作用域中非相关类的名称相匹配。
答案 1 :(得分:4)
如果您需要使用来自遥远地方的课程(事实上,如果您需要任何课程),那么您最好为他们创建和使用字典:
funcs = {'Eggs': foo.Eggs, 'Spam': bar.Spam}
def call_func(func_name, *args, **kwargs):
if not func_name in funcs:
raise ValueError('Function %r not available' % (func_name,))
return funcs[func_name](*args, **kwargs)
答案 2 :(得分:1)
对于给定的对象'obj',给定的方法名称'meth'和给定的参数集'args':
obj.__getattribute__(meth)(*args)
应该让你到那儿。
当然,不言而喻 - 你想做什么?
答案 3 :(得分:1)
选择要实例化的对象并不难。类是第一类对象,可以分配给变量或作为参数传递给函数。
class A(object):
def __init__( self, arg1, arg2 ):
etc.
class B(object):
def __init__( self, arg1, arg2 ):
etc.
thing_to_make = A
argList= ( some, pair )
thing_to_make( *argList )
thing_to_make = B
argList- ( another, pair )
thing_to_make( *argList )
def doSomething( class_, arg1, arg2 ):
thing= class_( arg1, arg2 )
thing.method()
print thing
一切都很好,没有多少痛苦。你不需要在Python中使用“call_user_function”类的东西
答案 4 :(得分:0)
你可以调用use getattr with locals()或globals()来做类似的事情
# foo.method() is called if it's available in global scope
getattr(globals()['foo'], 'method')(*args)
# Same thing, but for 'foo' in local scope
getattr(locals()['foo'], 'method')(*args)
另请参阅:getattr()上locals() and globals()上的深入Python