有一些子类,它们从一个基类继承。现在我希望程序根据列表中的输入自动选择正确的子类并实例化它。
最好的方法是什么?我知道有可能使用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()