目前,我有一个@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__
似乎没有帮助,因为它无法返回任何内容。有什么想法吗?
答案 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)
然后,使用循环等从孩子列表中获取孩子应该很简单。