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