adapter.py 2.2 KB

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