我知道可以使用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
的实例,无论其创建的范围是什么?
答案 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)
然而,你真的想问问自己为什么要做这一切。通常有更好的方法来处理动态对象访问,例如使用显式字典。