namedhao 发表于 2017-4-28 11:17:52

Python

  本作品采用知识共享署名-非商业性使用-相同方式共享 3.0 Unported许可协议进行许可。允许非商业转载,但应注明作者及出处。

作者:liuyuan_jq
2011-04-27

http://ginstrom.com/scribbles/2008/11/06/generic-adapter-class-in-python/




class Adapter(object):"""Adapts an object by replacing methods.Usage:dog = Dogdog = Adapter(dog, dict(make_noise=dog.bark))"""def __init__(self, obj, adapted_methods):"""We set the adapted methods in the object's dict"""self.obj = objself.__dict__.update(adapted_methods)def __getattr__(self, attr):"""All non-adapted calls are passed to the object"""return getattr(self.obj, attr)

完整实例

import osclass 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%s" % ("!" * octane_level)class Adapter(object):"""Adapts an object by replacing methods.Usage:dog = Dogdog = Adapter(dog, dict(make_noise=dog.bark))"""def __init__(self, obj, adapted_methods):"""We set the adapted methods in the object's dict"""self.obj = objself.__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()car_noise = lambda : car.make_noise(3)objects.append(Adapter(car, dict(make_noise=car_noise)))for obj in objects:print "A", obj.name, "goes", obj.make_noise()if __name__ == "__main__":main()

运行结果

A Dog goes woof! A Cat goes meow! A Human goes 'hello' A Car goes vroom!!!
页: [1]
查看完整版本: Python