From 14e03071fe050bdc436b313fc599d4cc9b3a75d3 Mon Sep 17 00:00:00 2001 From: vartagg Date: Tue, 2 Dec 2014 11:18:49 +0300 Subject: [PATCH 1/2] `set` method is better than direct change of the attribute --- builder.py | 17 ++++++++++------- 1 file changed, 10 insertions(+), 7 deletions(-) diff --git a/builder.py b/builder.py index 3b04412d..59bad780 100644 --- a/builder.py +++ b/builder.py @@ -11,15 +11,18 @@ class Director(object): def __init__(self): - self.builder = None + self._builder = None + + def set_builder(self, builder): + self._builder = builder def construct_building(self): - self.builder.new_building() - self.builder.build_floor() - self.builder.build_size() + self._builder.new_building() + self._builder.build_floor() + self._builder.build_size() def get_building(self): - return self.builder.building + return self._builder.building # Abstract Builder @@ -65,11 +68,11 @@ def __repr__(self): # Client if __name__ == "__main__": director = Director() - director.builder = BuilderHouse() + director.set_builder(BuilderHouse()) director.construct_building() building = director.get_building() print(building) - director.builder = BuilderFlat() + director.set_builder(BuilderFlat()) director.construct_building() building = director.get_building() print(building) From b9b5ea33423f71dd16ae4688f50fc78270f8fd40 Mon Sep 17 00:00:00 2001 From: vartagg Date: Tue, 2 Dec 2014 12:07:46 +0300 Subject: [PATCH 2/2] Rename adapted method passing to adapter for avoid confusion about identical method names. Adapted methods transformed to keyword arguments for more convenient external interface. --- adapter.py | 31 ++++++++++++++++++------------- 1 file changed, 18 insertions(+), 13 deletions(-) diff --git a/adapter.py b/adapter.py index 1620ce4c..0b8d35d8 100644 --- a/adapter.py +++ b/adapter.py @@ -3,23 +3,27 @@ """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'" @@ -27,6 +31,7 @@ def speak(self): class Car(object): def __init__(self): self.name = "Car" + def make_noise(self, octane_level): return "vroom{0}".format("!" * octane_level) @@ -37,18 +42,18 @@ class Adapter(object): Adapts an object by replacing methods. Usage: dog = Dog - dog = Adapter(dog, dict(make_noise=dog.bark)) + dog = Adapter(dog, dict(emit_sound=dog.bark)) >>> objects = [] >>> dog = Dog() - >>> objects.append(Adapter(dog, dict(make_noise=dog.bark))) + >>> objects.append(Adapter(dog, dict(emit_sound=dog.bark))) >>> cat = Cat() - >>> objects.append(Adapter(cat, dict(make_noise=cat.meow))) + >>> objects.append(Adapter(cat, dict(emit_sound=cat.meow))) >>> human = Human() - >>> objects.append(Adapter(human, dict(make_noise=human.speak))) + >>> objects.append(Adapter(human, dict(emit_sound=human.speak))) >>> car = Car() >>> car_noise = lambda: car.make_noise(3) - >>> objects.append(Adapter(car, dict(make_noise=car_noise))) + >>> objects.append(Adapter(car, dict(emit_sound=car_noise))) >>> for obj in objects: ... print('A {} goes {}'.format(obj.name, obj.make_noise())) @@ -58,8 +63,8 @@ class Adapter(object): A Car goes vroom!!! """ - def __init__(self, obj, adapted_methods): - """We set the adapted methods in the object's dict""" + def __init__(self, obj, **adapted_methods): + """We set the adapted methods in the kwargs""" self.obj = obj self.__dict__.update(adapted_methods) @@ -71,16 +76,16 @@ def __getattr__(self, attr): def main(): objects = [] dog = Dog() - objects.append(Adapter(dog, dict(make_noise=dog.bark))) + objects.append(Adapter(dog, emit_sound=dog.bark)) cat = Cat() - objects.append(Adapter(cat, dict(make_noise=cat.meow))) + objects.append(Adapter(cat, emit_sound=cat.meow)) human = Human() - objects.append(Adapter(human, dict(make_noise=human.speak))) + objects.append(Adapter(human, emit_sound=human.speak)) car = Car() - objects.append(Adapter(car, dict(make_noise=lambda: car.make_noise(3)))) + objects.append(Adapter(car, emit_sound=lambda: car.make_noise(3))) for obj in objects: - print("A {0} goes {1}".format(obj.name, obj.make_noise())) + print("A {0} goes {1}".format(obj.name, obj.emit_sound())) if __name__ == "__main__":