我已经得到了一本书“头先设计模式”,并开始用Python编写他们的一些例子。我已经谈到了Decorator模式的例子,我知道它应该使用组合,但是作者提出了一种“继承”。理由是装饰者是为了“实现类型匹配,而不是用来继承行为”。我有一个问题,我知道Python不是一种类型化语言,所以当我从这本书(用Java编写)中学习示例时,我得到了以下结论:
from abc import ABCMeta, abstractmethod
class Beverage:
__metaClass__=ABCMeta
def __init__(self):
self.Description="Beverage desconocida"
def getDescription(self):
return 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):
return 2.5
class Pasado(Beverage):
def __init__(self):
self.Description="Roasted coffee"
def calc(self):
return 1.5
class Mocha(CondimentDecorator):
def __init__(self,Beverage):
self.Beverage=Beverage
def getDescription(self):
return self.Beverage.getDescription()+" Mocha "
def calc(self):
return 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()
我想知道班级是否:
调味品(饮料)
做得很好,因为只要Python没有类型,我就不需要继承Beverage;对吗?你知道吗
如果我改成:
调味品decorator(),我的代码仍然可以工作,但在这种情况下,我想知道是否有必要拥有它,因为它只有一个抽象方法,就是它。你知道吗
我是否需要更改代码以与Python OOP编程更加一致?你知道吗
谢谢
Python没有严格的类型,通常不需要继承或抽象类。Decorator模式需要Decorator类,因为它应该定义Decorator类的每个方法来调用嵌入实例的方法。如果覆盖所有方法,则完全不需要这个decorator类。这是一个没有继承的版本:
另一方面,Python是一种动态语言,您可以编写一个动态装饰器
类GenericDecorator(对象): def初始化(self,obj): 自我.obj=对象
相关问题 更多 >
编程相关推荐