我有一个父班和不同的子班。我想封装将哪个子类初始化的决定。 一个简单的例子:
class Person:
def __init__(self, name):
if self.name_is_male(name):
real_instance = Male(name)
else:
real_instance = Female(name)
return real_instance
def name_is_male(self, name):
if name == 'Donald':
return True
elif name == 'Daisy':
return False
else:
raise ValueError('unknown name!')
class Male(Person):
def __init__(self, name):
...
class Female(Person):
def __init__(self, name):
...
这个简单的示例将以递归结束并且不起作用,但这是为了说明我的问题:如何在父类的初始化中封装决定要初始化哪个子类的决定?还是这完全是一个愚蠢的主意?
答案 0 :(得分:2)
尽管用例不是很清楚,但我会使用工厂设计模式来实现类似的目的。一个基本的例子可以是:
class Person(object):
# Create objects based on some name:
@staticmethod
def factory(name):
if name== "Male":
return Male()
elif name== "Female":
return Female()
else:
return None
class Male(Person):
pass
class Female(Person):
pass
person = Person.factory('Male')
答案 1 :(得分:0)
__init__
不应返回任何内容(或者:它必须返回None
)。当然,这并不是编写它的最佳方法,或者正如您所说的那样“完全是一个愚蠢的想法”。不能将其设为属性有特定原因吗?