我正在尝试实现工厂设计模式,到目前为止我已经做了这个工作。
import abc
class Button(object):
__metaclass__ = abc.ABCMeta
html = ""
def get_html(self, html):
return self.html
class ButtonFactory():
def create_button(self, type):
baseclass = Button()
targetclass = type.baseclass.capitalize()
return targetclass
button_obj = ButtonFactory()
button = ['image', 'input', 'flash']
for b in button:
print button_obj.create_button(b).get_html()
输出应该是所有按钮类型的HTML。
我得到这样的错误
AttributeError: 'str' object has no attribute 'baseclass'
我正在尝试实现一个具有不同变体的类,如ImageButton、InputButton和FlashButton。根据位置不同,可能需要为按钮创建不同的HTML
最佳答案
您试图调用不存在的baseclass
属性,因为str
获取字符串值(其中之一)。
如果要根据表示对象名称的字符串创建对象,可以使用b
字典,该字典保存变量名称与其值之间的映射。
class Button(object):
html = ""
def get_html(self):
return self.html
class Image(Button):
html = "<img></img>"
class Input(Button):
html = "<input></input>"
class Flash(Button):
html = "<obj></obj>"
class ButtonFactory():
def create_button(self, typ):
targetclass = typ.capitalize()
return globals()[targetclass]()
button_obj = ButtonFactory()
button = ['image', 'input', 'flash']
for b in button:
print button_obj.create_button(b).get_html()
编辑:
使用
['image', 'input', 'flash']
或globals()
也不是一个好的实践,因此,如果可以,最好在相关对象及其名称之间创建一个映射,如下所示:button_objects = {'image':Image,'flash':Flash,'input':Input}
并将
globals()
替换为:def create_button(self, typ):
return button_objects[typ]()
关于python - 工厂设计模式,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/21025959/