java - how to change this decorator into Python? -
i have gotten re-create of book "head first design patterns", , started codify of examples in python. have came illustration decorator pattern, know should utilize composition, author puts sort of "inheritance". excuse decorator made "achieve type matching, not used inherit behaviour". have question here, know python not typed language when illustration book (which in java), got this:
from abc import abcmeta, abstractmethod class beverage: __metaclass__=abcmeta def __init__(self): self.description="beverage desconocida" def getdescription(self): homecoming self.description @abstractmethod def calc(self): pass class condimentdecorator(beverage): __metaclass__=abcmeta @abstractmethod def getdescription(self): pass class espresso(beverage): def __init__(self): self.description="espresso" def calc(self): homecoming 2.5 class pasado(beverage): def __init__(self): self.description="roasted coffee" def calc(self): homecoming 1.5 class mocha(condimentdecorator): def __init__(self,beverage): self.beverage=beverage def getdescription(self): homecoming self.beverage.getdescription()+" mocha " def calc(self): homecoming 0.5+self.beverage.calc() def main(): beverage=espresso() print beverage.getdescription()," cost: ",beverage.calc() beverage2=pasado() beverage2=mocha(beverage2) print beverage2.getdescription()," cost: ",beverage2.calc() beverage3=espresso() beverage3=mocha(mocha(beverage3)) print beverage3.getdescription()," cost: ",beverage3.calc() i wonder if class:
condimentdecorator(beverage)
is done, because long python has no types, not need inherit beverage; right?
if alter like:
condimentdecorator(), code works still, in case wonder if necessary have it, because has 1 abstract method , that's it.
do need alter code more consistent python oop programming?
thanks
python has no strict typing , there no need in inheritance or abstract classes. decorator-class needed decorator pattern, because should define every method of decorated class phone call method of embedded instance. if overwrite methods, strictly don't need decorator class. here version without inheritance:
class espresso(object): description="espresso" def calc(self): homecoming 2.5 class pasado(object): description="roasted coffee" def calc(self): homecoming 1.5 class mocha(object): def __init__(self, beverage): self.beverage = drink @property def description(self): homecoming self.beverage.description+" mocha" def calc(self): homecoming 0.5+self.beverage.calc() def main(): drink = espresso() print beverage.description, " cost: ", beverage.calc() beverage2 = pasado() beverage2 = mocha(beverage2) print beverage2.description, " cost: ", beverage2.calc() beverage3 = espresso() beverage3 = mocha(mocha(beverage3)) print beverage3.description, " cost: ", beverage3.calc() if __name__ == '__main__': main() on other side, python dynamic language, , write dynamic decorator
class genericdecorator(object): def init(self, obj): self.obj = obj
def __getattr__(self, name): homecoming getattr(self.obj, name) class flavored(genericdecorator): """flavor free""" def __init__(self, beverage, flavor): genericdecorator.__init__(self, beverage) self.flavor = flavor @property def description(self): homecoming self.flavor + '-' + self.obj.description def main(): drink = espresso() drink = flavored(beverage, 'vanilla') print beverage.description, " cost: ", beverage.calc() if __name__ == '__main__': main() java python decorator
No comments:
Post a Comment