自动选择正确的子类,从Python 3.x

时间:2018-01-19 13:10:03

标签: python python-3.x inheritance instantiation

有一些子类,它们从一个基类继承。现在我希望程序根据列表中的输入自动选择正确的子类并实例化它。

最好的方法是什么?我知道有可能使用if-elif语句创建工厂方法。但我更喜欢将子类注册到基类,以使系统尽可能模块化。因此,当添加新的子类时,其他所有子类都可以保持不变。

我读到了工厂类,工厂方法,元类和装饰器。但最后我想在基类中使用某种create(subclass_keyword)方法。此方法获取关键字作为输入,选择正确的子类进行实例化并返回它。这在Python 3.x中是否可行?

我试图这样做,但还没有成功。您对如何应对挑战有一些提示吗?以下是展示我的目标的代码:

class Shape:
    subclasses = dict()
    def __init__(self, width, height):
        self.width = width
        self.height = height
    @staticmethod
    def register_subclass(subclass, name):
        Shape.subclasses[name] = subclass
        return subclass
    @staticmethod
    def create(shape_type, width, height):
        return Shape.subclasses[shape_type](width, height)

@Shape.register_subclass('circle')
class Circle(Shape):
    def draw(self): print("Draw circle of %s x %s." % (str(self.width), str(self.height)))
    def erase(self): print ("Erase circle.")

@Shape.register_subclass('square')
class Square(Shape):
    def draw(self): print("Draw square of %s x %s." % (str(self.width), str(self.height)))
    def erase(self): print ("Erase square")

forms_str = ["square", "circle", "circle", "square"]
forms = []
for item in forms_str:
    forms.append(Shape.create(item, 10, 10))

for elem in forms:
    elem.draw()
    elem.erase()

0 个答案:

没有答案