封装决定要初始化哪个子类

时间:2018-07-22 12:18:45

标签: python inheritance

我有一个父班和不同的子班。我想封装将哪个子类初始化的决定。 一个简单的例子:

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):
        ...

这个简单的示例将以递归结束并且不起作用,但这是为了说明我的问题:如何在父类的初始化中封装决定要初始化哪个子类的决定?还是这完全是一个愚蠢的主意?

2 个答案:

答案 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')

factory method design pattern上的另一个示例

答案 1 :(得分:0)

__init__不应返回任何内容(或者:它必须返回None)。当然,这并不是编写它的最佳方法,或者正如您所说的那样“完全是一个愚蠢的想法”。不能将其设为属性有特定原因吗?