从“obj.method”字符串中获取绑定方法

时间:2014-07-10 16:56:48

标签: python python-2.7

我知道可以使用getattr从对象和字符串中获取方法,例如

this_func = getattr(MyObj, 'method_name')
this_func(*args, **kwargs)

但是,我试图超越这个并传递“object.method”字符串并同时获取对象和方法,我还没有看到可靠的方法。

例如,如果我有这样的函数:

def func_from_string(callstr):
    obj, meth = callstr.split('.') # turns 'obj.foo' into 'obj', 'foo'
    o = globals.get(obj)
    if o is not None:
        return getattr(o, meth)

...只有在一切都在全球范围内时才有效。如果在单独的函数中创建对象,则失败。

def some_other_func():
    MyObj = SomeObject()
    f = func_from_string("MyObj.foo")
    f()

执行可怕的globals().get("obj", locals().get("obj"))并未改变此结果 - MyObj未见func_from_string,因此这不起作用。

我发现可能有obj.meth.__self__的后门,但为了做到这一点,我仍然必须以某种方式达到绑定方法,而且我不清楚我是否可以在没有首先到达对象。

我可能只是尝试做一些神奇的事情 - 但有没有正确的方法来使用字符串“MyObj”来获取 MyObj的实例,无论其创建的范围是什么?

1 个答案:

答案 0 :(得分:0)

这将变得丑陋。 func_from_string()可以访问范围,要求Python使用sys._getframe()返回该框架:

import sys

def func_from_string(callstr):
    obj, meth = callstr.split('.')
    parent_scope = sys._getframe(1)
    o = parent_scope.f_locals.get(obj)
    if o is not None:
        return getattr(o, meth)

然而,你真的想问问自己为什么要做这一切。通常有更好的方法来处理动态对象访问,例如使用显式字典。