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