【问题标题】:Change self of parent class to subClass将父类的自我更改为子类
【发布时间】:2012-10-23 12:29:22
【问题描述】:

我有一个类似的结构,

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 类的值)

提前致谢

【问题讨论】:

标签: python class self


【解决方案1】:

只使用一个函数:

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

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

这通常被称为工厂。


如果你希望能够为初始化器提供自定义参数,你可以使用这个:

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

然后这样称呼它:

z = foo(True)(params for Bar/Zoo)

【讨论】:

  • @Wooble 我的错误我用__init__检查了它。
  • 大概 OP 实际上希望 BarZoo 有一个共同的超类,而真正的用例并不像示例那么简单。
  • @Wooble 啊,我没有注意到继承。但是,他仍然可以将函数用作工厂。
  • 感谢工厂函数的回答,但我需要继承结构。还有其他方法,new 有帮助吗?
  • @ProgramQuestions 这适用于继承。你只需调用foo 而不是Foo
【解决方案2】:

这正是__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

【讨论】:

  • 当你可以只使用一个函数时使用__new__()有什么意义?
  • @phant0m 为什么它们不能都有效?
  • 我的意图只是提供一个替代方案。差异具有更多的“信息/文档特征”。
  • @MarkusUnterwaditzer 我并不是说它不是。只是看起来有点过头了 ;) -- glglgl:回想起来,我应该措辞更好一点,我不是故意听起来那么刺耳的。
  • 我只是改变了__new__的行为方式。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-01-21
  • 2019-03-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多