adapter.py 2.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091
  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{0}".format("!" * 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 {} goes {}'.format(obj.name, 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. def main():
  54. objects = []
  55. dog = Dog()
  56. objects.append(Adapter(dog, dict(make_noise=dog.bark)))
  57. cat = Cat()
  58. objects.append(Adapter(cat, dict(make_noise=cat.meow)))
  59. human = Human()
  60. objects.append(Adapter(human, dict(make_noise=human.speak)))
  61. car = Car()
  62. objects.append(Adapter(car, dict(make_noise=lambda: car.make_noise(3))))
  63. for obj in objects:
  64. print("A {0} goes {1}".format(obj.name, obj.make_noise()))
  65. if __name__ == "__main__":
  66. import doctest
  67. doctest.testmod()