diff --git a/cookbook/c07/p12_closure_access.py b/cookbook/c07/p12_closure_access.py index cc51c3f..cab3e27 100644 --- a/cookbook/c07/p12_closure_access.py +++ b/cookbook/c07/p12_closure_access.py @@ -29,3 +29,38 @@ f = sample() f() f.set_n(10) f() + +import sys +class ClosureInstance: + def __init__(self, locals=None): + if locals is None: + locals = sys._getframe(1).f_locals + + # Update instance dictionary with callables + self.__dict__.update((key,value) for key, value in locals.items() + if callable(value) ) + # Redirect special methods + def __len__(self): + return self.__dict__['__len__']() + +# Example use +def Stack(): + items = [] + def push(item): + items.append(item) + + def pop(): + return items.pop() + + def __len__(): + return len(items) + + return ClosureInstance() + +s = Stack() +print(s) +s.push(10) +s.push(20) +print(len(s)) +print(s.pop()) +print(s.pop())