| 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() |