mirror of
				https://github.com/python/cpython.git
				synced 2025-10-30 21:21:22 +00:00 
			
		
		
		
	
		
			
	
	
		
			46 lines
		
	
	
	
		
			1.2 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
		
		
			
		
	
	
			46 lines
		
	
	
	
		
			1.2 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
|   | 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() |