|
1 import types |
|
2 |
|
3 class Tracing: |
|
4 def __init__(self, name, bases, namespace): |
|
5 """Create a new class.""" |
|
6 self.__name__ = name |
|
7 self.__bases__ = bases |
|
8 self.__namespace__ = namespace |
|
9 def __call__(self): |
|
10 """Create a new instance.""" |
|
11 return Instance(self) |
|
12 |
|
13 class Instance: |
|
14 def __init__(self, klass): |
|
15 self.__klass__ = klass |
|
16 def __getattr__(self, name): |
|
17 try: |
|
18 value = self.__klass__.__namespace__[name] |
|
19 except KeyError: |
|
20 raise AttributeError, name |
|
21 if type(value) is not types.FunctionType: |
|
22 return value |
|
23 return BoundMethod(value, self) |
|
24 |
|
25 class BoundMethod: |
|
26 def __init__(self, function, instance): |
|
27 self.function = function |
|
28 self.instance = instance |
|
29 def __call__(self, *args): |
|
30 print "calling", self.function, "for", self.instance, "with", args |
|
31 return apply(self.function, (self.instance,) + args) |
|
32 |
|
33 Trace = Tracing('Trace', (), {}) |
|
34 |
|
35 class MyTracedClass(Trace): |
|
36 def method1(self, a): |
|
37 self.a = a |
|
38 def method2(self): |
|
39 return self.a |
|
40 |
|
41 aninstance = MyTracedClass() |
|
42 |
|
43 aninstance.method1(10) |
|
44 |
|
45 print aninstance.method2() |