adapter.py 2.2 KB

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