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 に答える