/Demo/metaclasses/Simple.py

http://unladen-swallow.googlecode.com/ · Python · 45 lines · 35 code · 8 blank · 2 comment · 3 complexity · 1ad5f8c6f0d388c2b88ec16bb224e50b MD5 · raw file

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