adapter.py 1.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576
  1. # http://ginstrom.com/scribbles/2008/11/06/generic-adapter-class-in-python/
  2. import os
  3. class Dog(object):
  4. def __init__(self):
  5. self.name = "Dog"
  6. def bark(self):
  7. return "woof!"
  8. class Cat(object):
  9. def __init__(self):
  10. self.name = "Cat"
  11. def meow(self):
  12. return "meow!"
  13. class Human(object):
  14. def __init__(self):
  15. self.name = "Human"
  16. def speak(self):
  17. return "'hello'"
  18. class Car(object):
  19. def __init__(self):
  20. self.name = "Car"
  21. def make_noise(self, octane_level):
  22. return "vroom%s" % ("!" * octane_level)
  23. class Adapter(object):
  24. """
  25. Adapts an object by replacing methods.
  26. Usage:
  27. dog = Dog
  28. dog = Adapter(dog, dict(make_noise=dog.bark))
  29. >>> objects = []
  30. >>> dog = Dog()
  31. >>> objects.append(Adapter(dog, dict(make_noise=dog.bark)))
  32. >>> cat = Cat()
  33. >>> objects.append(Adapter(cat, dict(make_noise=cat.meow)))
  34. >>> human = Human()
  35. >>> objects.append(Adapter(human, dict(make_noise=human.speak)))
  36. >>> car = Car()
  37. >>> car_noise = lambda: car.make_noise(3)
  38. >>> objects.append(Adapter(car, dict(make_noise=car_noise)))
  39. >>> for obj in objects:
  40. ... print("A", obj.name, "goes", obj.make_noise())
  41. ('A', 'Dog', 'goes', 'woof!')
  42. ('A', 'Cat', 'goes', 'meow!')
  43. ('A', 'Human', 'goes', "'hello'")
  44. ('A', 'Car', 'goes', 'vroom!!!')
  45. """
  46. def __init__(self, obj, adapted_methods):
  47. """We set the adapted methods in the object's dict"""
  48. self.obj = obj
  49. self.__dict__.update(adapted_methods)
  50. def __getattr__(self, attr):
  51. """All non-adapted calls are passed to the object"""
  52. return getattr(self.obj, attr)
  53. if __name__ == "__main__":
  54. import doctest
  55. doctest.testmod()