使用工厂对象初始化基类

时间:2015-03-05 23:10:16

标签: python python-3.x

我有一个基类,我总是想用工厂对象创建对象。

class Shape:
  def __init__(self):
    pass

class ShapeMgr:
  def __init__(self):
    self.allShapes = []

  def new(self):
    newShape = Shape()
    self.allShapes.append( newShape )
    return newShape

我也从该基类派生了类。

class Circle(Shape):
  def __init__(self):
    pass

我想从工厂对象初始化派生类对象的基类。 IE,我想通过调用ShapeMgr.new()来创建Circle的Shape部分。

我已尝试按如下方式定义Shape构造函数:

SM = ShapeMgr()
class Circle:
  def __init__(self):
    global SM
    super() = SM.new()

但它告诉我,我无法分配函数调用的结果。如果我改为尝试:

    self = SM.new()

然后,当我尝试访问Circle方法时,它表示Shapes没有Circle方法。

有没有办法使用工厂来创建派生类对象的基类部分?

1 个答案:

答案 0 :(得分:0)

如果您希望Circle调用Shape进行初始化,请执行以下操作:

class Circle(Shape):
    def __init__(self):  # important!
        super().__init__()

如果您的目标是让Circle最终进入ShapeMgr,则根本不需要担心基类(Shape),因为Shape中没有任何内容1}}使注册变得高兴。

更改ShapeMgr.new()以接受要注册的可选对象,如果没有给出对象,则创建一个新的Shape

def new(self, obj=None):
    if obj is None:
        obj = Shape()
    self.allShapes.append(obj)

请注意,必须在Python中声明self - 如果没有它,您的方法将无法正常工作。