有一个类来初始化来自不同类的对象

时间:2017-02-10 19:04:26

标签: python class inheritance polymorphism factory-method

目前,我有一个@classmethod,它返回给定变量的正确类。它看起来像:

class Parent():
  @classmethod
  def GetInstance(cls, variable):
    if variable == 'foo':
      return Child()


class Child(Parent):
  def Something(self):
    pass

instance = Parent.GetInstance('foo')
result = instance.Something()

我不想定义和使用GetInstance。相反,我希望Main()只是:

instance = Parent('foo')
result = instance.Something()

同时保持上述结构的所有好处。我希望类Parent()在调用时返回类Child()的对象,而不需要使用方法。遗憾的是,__init__似乎没有帮助,因为它无法返回任何内容。有什么想法吗?

3 个答案:

答案 0 :(得分:0)

只需覆盖“”特殊方法即可。这是''方法,负责调用创建实例,分配内存,然后通过调用“ init ”对其进行初始化。具体是

  

new 是静态类方法,而 init 是实例方法。 必须先创建实例,因此 init 可以初始化它。请注意, init 将self作为参数。在你创建实例之前,没有自我。

答案 1 :(得分:0)

编辑好的,我回去修理了它。完全hackey和非常脆弱。我希望你不要继续扩展这个。我把它放在这里作为为什么这是一个坏主意的说明。

以下是 如何实现此目标的草图。但请,只使用工厂方法

>>> class Parent(object):
...     def __new__(typ, *args, **kwargs):
...         if args and args[0] == 'foo':
...             return Child()
...         else:
...             return super(Parent, typ).__new__(typ)
...
>>> class Child(Parent):
...     __new__ = object.__new__
...
>>> a = Parent('foo')
>>> a
<__main__.Child object at 0x1023275f8>
>>> p = Parent()
>>> p
<__main__.Parent object at 0x1023275c0>
>>>

答案 2 :(得分:-1)

在父类中添加子项[]列表:

class Parent():
    def __init__(self):
        children = list()

这样你就可以创建一个child()对象,然后通过执行以下操作来附加它:

child - Child()  # create new child obj
parent.children.append(child)

然后,使用循环等从孩子列表中获取孩子应该很简单。