Where does a class closure live?

Gerard Brunick gbrunick at andrew.cmu.edu
Wed Dec 6 16:53:00 EST 2006


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'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?
-Gerard



More information about the Python-list mailing list