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

时间:2009-05-13 09:33:24

标签: php python

python在PHP中是否有像call_user_func()这样的函数?

PHP版本:

call_user_func(array($object,$methodName),$parameters)    

如何在Python中实现上述目标?

5 个答案:

答案 0 :(得分:8)

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

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

如果object也是一个字符串,那么这可以使用globalslocals(但是您可能还有其他更大的问题):

>>> 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