从Python中的Wrapped函数中获取Context对象

时间:2012-05-14 07:14:46

标签: python closures

鉴于以下内容:

class MyClass:
    def __init__(self, someval):
        self.someval = someval
    def get_a_function(self):
        def result():
            return self.someval
        return result

inst = MyClass("my value")
func = inst.get_a_function()

我只有func,并希望获得inst。这有可能,如果是的话,怎么样?注意:我不控制MyClass或如何声明inst

P.S。我知道这是baaadddd风格,但我很好奇是否可以做到。

1 个答案:

答案 0 :(得分:3)

您注意到结果如何返回self.someval,这意味着它有一个闭包。您需要做的就是深入了解关闭。为此,请使用func_closure属性:

>>> class MyClass:
...     def __init__(self, someval):
...         self.someval = someval
...     def get_a_function(self):
...         def result():
...             return self.someval
...         return result
... 
>>> inst = MyClass("my value")
>>> func = inst.get_a_function()
>>> func
<function result at 0x8d3efb4>
>>> func.func_closure
(<cell at 0x8dbc554: instance object at 0x8d321cc>,)
>>> func.func_closure[0].cell_contents
<__main__.MyClass instance at 0x8d321cc>

请注意,我只是访问闭包的第一个元素。如果函数更复杂,它的闭包可能有多个对象,你需要测试你想要的那个。

编辑:这是非常糟糕的风格btw:)