2012-05-14 3 views
1

Учитывая следующее:Получить объект контекста из завернутых функций в Python

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, но мне интересно, если это можно сделать.

ответ

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 :)

+0

Прохладный, это в основном то, что я хотел. Я на самом деле уже работал с cell_contents, но мой реальный случай был немного сложнее, поэтому мне нужно было сделать 'func.func_closure [0] .cell_contents.func_closure [0] .cell_contents'. –

Смежные вопросы