Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/347.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 封装决定初始化哪个子类_Python_Inheritance - Fatal编程技术网

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

Python 封装决定初始化哪个子类,python,inheritance,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

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

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

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

\uuuu init\uuuu
不应该返回任何内容(或者更确切地说:它必须返回
None
)。在我看来,这不是最好的写作方式,或者正如你所说的“完全是一个愚蠢的想法”。它不能成为属性有什么特别的原因吗?

\uuuu init\uuuu
不应该返回任何东西(或者更确切地说:它必须返回
None
)。在我看来,这不是最好的写作方式,或者正如你所说的“完全是一个愚蠢的想法”。它不能成为属性有什么特别的原因吗?

虽然用例不是很清楚,但我会使用factory设计模式来实现类似的功能。一个基本的例子可以是:

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设计模式来实现类似的功能。一个基本的例子可以是:

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

上的另一个例子是,您可以拥有一个
Person
类,其
gender
属性为
'male'
'female'
如果需要另一个类,为什么要实例化一个类?如果要在创建实例之前测试名称,可以将
name\u is\u male
定义为静态方法。(祝您好运)您可以有一个
Person
类,其
gender
属性为
'male'
'female'
如果您需要另一个类,为什么要实例化一个类?如果要在创建实例之前测试名称,可以将
name\u is\u male
定义为静态方法。(祝你好运)这正是我想要的。我不熟悉这个概念。另一个很好的解释是:这也可以通过
\uuuu new\uuuu
来实现,但是工厂函数更简单。这正是我想要的。我不熟悉这个概念。另一个很好的解释是:这也可以通过
\uuuuu new\uuuuu
实现,但工厂函数更容易实现。