123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105 |
- #!/usr/bin/env python
- # -*- coding: utf-8 -*-
- """http://ginstrom.com/scribbles/2008/11/06/generic-adapter-class-in-python/"""
- import os
- class Dog(object):
- def __init__(self):
- self.name = "Dog"
- def bark(self):
- return "woof!"
- class Cat(object):
- def __init__(self):
- self.name = "Cat"
- def meow(self):
- return "meow!"
- class Human(object):
- def __init__(self):
- self.name = "Human"
- def speak(self):
- return "'hello'"
- class Car(object):
- def __init__(self):
- self.name = "Car"
- def make_noise(self, octane_level):
- return "vroom{0}".format("!" * octane_level)
- class Adapter(object):
- """
- Adapts an object by replacing methods.
- Usage:
- dog = Dog
- dog = Adapter(dog, dict(make_noise=dog.bark))
- >>> objects = []
- >>> dog = Dog()
- >>> objects.append(Adapter(dog, dict(make_noise=dog.bark)))
- >>> cat = Cat()
- >>> objects.append(Adapter(cat, dict(make_noise=cat.meow)))
- >>> human = Human()
- >>> objects.append(Adapter(human, dict(make_noise=human.speak)))
- >>> car = Car()
- >>> car_noise = lambda: car.make_noise(3)
- >>> objects.append(Adapter(car, dict(make_noise=car_noise)))
- >>> for obj in objects:
- ... print('A {} goes {}'.format(obj.name, obj.make_noise()))
- A Dog goes woof!
- A Cat goes meow!
- A Human goes 'hello'
- A Car goes vroom!!!
- """
- def __init__(self, obj, adapted_methods):
- """We set the adapted methods in the object's dict"""
- self.obj = obj
- self.__dict__.update(adapted_methods)
- def __getattr__(self, attr):
- """All non-adapted calls are passed to the object"""
- return getattr(self.obj, attr)
- def main():
- objects = []
- dog = Dog()
- objects.append(Adapter(dog, dict(make_noise=dog.bark)))
- cat = Cat()
- objects.append(Adapter(cat, dict(make_noise=cat.meow)))
- human = Human()
- objects.append(Adapter(human, dict(make_noise=human.speak)))
- car = Car()
- objects.append(Adapter(car, dict(make_noise=lambda: car.make_noise(3))))
- for obj in objects:
- print("A {0} goes {1}".format(obj.name, obj.make_noise()))
- if __name__ == "__main__":
- main()
- ### OUTPUT ###
- # A Dog goes woof!
- # A Cat goes meow!
- # A Human goes 'hello'
- # A Car goes vroom!!!
|