forked from faif/python-patterns
- Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathadapter.py
More file actions
Latest commit
93 lines (73 loc) · 2.26 KB
/
Copy pathadapter.py
File metadata and controls
93 lines (73 loc) · 2.26 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
#!/usr/bin/env python
# -*- coding: utf-8 -*-
"""http://ginstrom.com/scribbles/2008/11/06/generic-adapter-class-in-python/"""
importos
classDog(object):
def__init__(self):
self.name="Dog"
defbark(self):
return"woof!"
classCat(object):
def__init__(self):
self.name="Cat"
defmeow(self):
return"meow!"
classHuman(object):
def__init__(self):
self.name="Human"
defspeak(self):
return"'hello'"
classCar(object):
def__init__(self):
self.name="Car"
defmake_noise(self, octane_level):
return"vroom{0}".format("!"*octane_level)
classAdapter(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"""
returngetattr(self.obj, attr)
defmain():
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))))
forobjinobjects:
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!!!