"Gerard Brunick" <[EMAIL PROTECTED]> wrote in message news:[EMAIL PROTECTED] > Consider: > > ### Function closure example > > def outer(s): > ... def inner(): > ... print s > ... return inner > ... > >>> f = outer(5) > >>> f() > 5 > >>> dir(f) > ['__call__', '__class__', '__delattr__', '__dict__', '__doc__', > '__get__', '__getattribute__', '__hash__', '__init__', '__module__', > '__name__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', > '__setattr__', '__str__', 'func_closure', 'func_code', 'func_defaults', > 'func_dict', 'func_doc', 'func_globals', 'func_name'] > > ### Class instance closure example > > >>> def outer2(s): > ... class Inner(object): > ... def __call__(self): > ... print s > ... return Inner() > ... > >>> f = outer2(10) > >>> f() > 10 > >>> dir(f) > ['__call__', '__class__', '__delattr__', '__dict__', '__doc__', > '__getattribute__', '__hash__', '__init__', '__module__', '__new__', > '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__str__', > '__weakref__'] > > ##### Class closure example > > >>> def outer3(s): > ... class Inner(object): > ... def __call__(self): > ... print s > ... return Inner > ... > >>> F = outer3(15) > >>> f = F() > >>> f() > 15 > >>> dir(F) > ['__call__', '__class__', '__delattr__', '__dict__', '__doc__', > '__getattribute__', '__hash__', '__init__', '__module__', '__new__', > '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__str__', > '__weakref__'] > > > Now the closure for the function live in func_name.
I don't understand this, but > I've even done the > exercise where I build a dummy inner function that returns its closed > variable, so that I can use that thing to reach through "cells" and > check out the variables living in the closure object. Where are the > closure variables for the class instance, and the class? Can I get my > hands on them in Python? [not tested but fairly sure correct...] There is no closure variable for the class or the instance, only for the __call__ function, which should have a func_closure attribute just as your first example did. Access that as Inner.__dict__['__call__'], where 'Inner' is either F or f.__class__. Terry Jan Reedy -- http://mail.python.org/mailman/listinfo/python-list