我正在尝试实现工厂设计模式,到目前为止我已经做了这个工作。

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/

10-11 08:53