Where does a class closure live?

Terry Reedy tjreedy at udel.edu
Wed Dec 6 21:29:33 EST 2006


"Gerard Brunick" <gbrunick at andrew.cmu.edu> wrote in message 
news:45773BBC.5020301 at andrew.cmu.edu...
> 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








More information about the Python-list mailing list