1

我有一个结构,

class Foo(object):
    def __init__(self, value=True):
        if value:
            Bar()
        else:
            Zoo()
    pass

class Bar(Foo):
    pass

class Zoo(Foo):
    pass




z = Foo(True)  # instance of Foo() class

当我实例化类Foo()时,它将返回Foo类的实例,但我希望它应该返回BarZoo类的实例(即根据提供给 Foo 类的值调用的任何类)

提前致谢

4

2 回答 2

7

只需使用一个功能:

def foo(value=True):
    if value:
        return Bar()
    else:
        return Zoo()

不需要类,因为您只想从其他两个类创建实例。因此,您可以只使用一个函数在两者之间进行选择。

这通常被称为工厂。


如果您希望能够为初始化程序提供自定义参数,您可以使用:

def foo(value=True):
    if value:
        return Bar
    else:
        return Zoo

并这样称呼它:

z = foo(True)(params for Bar/Zoo)
于 2012-10-23T12:31:59.020 回答
4

这正是__new__()

class Foo(object):
    def __new__(cls, value=True):
        if cls != Foo:
            return super(Foo, cls).__new__(cls)
        elif value:
            return super(Foo, cls).__new__(Bar)
        else:
            return super(Foo, cls).__new__(Zoo)

class Bar(Foo):
    pass

class Zoo(Foo):
    pass

z = Foo(True)  # instance of Bar() class
于 2012-10-23T12:36:03.000 回答