/Demo/metaclasses/Simple.py
http://unladen-swallow.googlecode.com/ · Python · 45 lines · 35 code · 8 blank · 2 comment · 3 complexity · 1ad5f8c6f0d388c2b88ec16bb224e50b MD5 · raw file
- import types
- class Tracing:
- def __init__(self, name, bases, namespace):
- """Create a new class."""
- self.__name__ = name
- self.__bases__ = bases
- self.__namespace__ = namespace
- def __call__(self):
- """Create a new instance."""
- return Instance(self)
- class Instance:
- def __init__(self, klass):
- self.__klass__ = klass
- def __getattr__(self, name):
- try:
- value = self.__klass__.__namespace__[name]
- except KeyError:
- raise AttributeError, name
- if type(value) is not types.FunctionType:
- return value
- return BoundMethod(value, self)
- class BoundMethod:
- def __init__(self, function, instance):
- self.function = function
- self.instance = instance
- def __call__(self, *args):
- print "calling", self.function, "for", self.instance, "with", args
- return apply(self.function, (self.instance,) + args)
- Trace = Tracing('Trace', (), {})
- class MyTracedClass(Trace):
- def method1(self, a):
- self.a = a
- def method2(self):
- return self.a
- aninstance = MyTracedClass()
- aninstance.method1(10)
- print aninstance.method2()