blob: 8878adedb4bdc8a4c6f7976928730e8e78bd45e5 [file] [log] [blame]
Guido van Rossum0cdb8871997-08-26 00:08:51 +00001import types
2
3class 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
13class 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 Winter6f2df4d2007-07-17 20:59:35 +000020 raise AttributeError(name)
Guido van Rossum0cdb8871997-08-26 00:08:51 +000021 if type(value) is not types.FunctionType:
22 return value
23 return BoundMethod(value, self)
24
25class BoundMethod:
26 def __init__(self, function, instance):
27 self.function = function
28 self.instance = instance
29 def __call__(self, *args):
Collin Winter6f2df4d2007-07-17 20:59:35 +000030 print("calling", self.function, "for", self.instance, "with", args)
Neal Norwitzd9108552006-03-17 08:00:19 +000031 return self.function(self.instance, *args)
Guido van Rossum0cdb8871997-08-26 00:08:51 +000032
33Trace = Tracing('Trace', (), {})
34
35class MyTracedClass(Trace):
36 def method1(self, a):
37 self.a = a
38 def method2(self):
39 return self.a
40
41aninstance = MyTracedClass()
42
43aninstance.method1(10)
44
Collin Winter6f2df4d2007-07-17 20:59:35 +000045print(aninstance.method2())