adapter.py 1.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172
  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. """
  30. def __init__(self, obj, adapted_methods):
  31. """We set the adapted methods in the object's dict"""
  32. self.obj = obj
  33. self.__dict__.update(adapted_methods)
  34. def __getattr__(self, attr):
  35. """All non-adapted calls are passed to the object"""
  36. return getattr(self.obj, attr)
  37. def main():
  38. objects = []
  39. dog = Dog()
  40. objects.append(Adapter(dog, dict(make_noise=dog.bark)))
  41. cat = Cat()
  42. objects.append(Adapter(cat, dict(make_noise=cat.meow)))
  43. human = Human()
  44. objects.append(Adapter(human, dict(make_noise=human.speak)))
  45. car = Car()
  46. objects.append(Adapter(car, dict(make_noise=lambda: car.make_noise(3))))
  47. for obj in objects:
  48. print("A", obj.name, "goes", obj.make_noise())
  49. if __name__ == "__main__":
  50. main()