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