adapter.py 2.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105
  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, dict(make_noise=dog.bark)))
  34. >>> cat = Cat()
  35. >>> objects.append(Adapter(cat, dict(make_noise=cat.meow)))
  36. >>> human = Human()
  37. >>> objects.append(Adapter(human, dict(make_noise=human.speak)))
  38. >>> car = Car()
  39. >>> car_noise = lambda: car.make_noise(3)
  40. >>> objects.append(Adapter(car, dict(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, dict(make_noise=dog.bark)))
  59. cat = Cat()
  60. objects.append(Adapter(cat, dict(make_noise=cat.meow)))
  61. human = Human()
  62. objects.append(Adapter(human, dict(make_noise=human.speak)))
  63. car = Car()
  64. objects.append(Adapter(car, dict(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!!!