1

鉴于以下情况:

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声明。

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

4

1 回答 1

3

你注意到 result 是如何返回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>

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

编辑:顺便说一句,这真是糟糕的风格:)

于 2012-05-14T07:21:05.127 回答