Guido van Rossum | 0cdb887 | 1997-08-26 00:08:51 +0000 | [diff] [blame] | 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: |
Collin Winter | 6f2df4d | 2007-07-17 20:59:35 +0000 | [diff] [blame] | 20 | raise AttributeError(name) |
Guido van Rossum | 0cdb887 | 1997-08-26 00:08:51 +0000 | [diff] [blame] | 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): |
Collin Winter | 6f2df4d | 2007-07-17 20:59:35 +0000 | [diff] [blame] | 30 | print("calling", self.function, "for", self.instance, "with", args) |
Neal Norwitz | d910855 | 2006-03-17 08:00:19 +0000 | [diff] [blame] | 31 | return self.function(self.instance, *args) |
Guido van Rossum | 0cdb887 | 1997-08-26 00:08:51 +0000 | [diff] [blame] | 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 | |
Collin Winter | 6f2df4d | 2007-07-17 20:59:35 +0000 | [diff] [blame] | 45 | print(aninstance.method2()) |