在 Python 中实例化时选择子类

Selecting a subclass at instantiation in Python

我想在实例化时从某些 类 中选择一个子类到 select 特定属性。我已经计算出以下内容:

代码

class Foo:
    a = "foo"

    def __init__(self, dtype=Bar):
            self.__class__ = dtype


class Bar:
    b = "bar"


class Baz(Bar):
    c = "baz"

演示

Foo(dtype=Bar).b
# 'bar'

Foo(dtype=Baz).b
# 'bar'

Foo(dtype=Baz).c
# 'baz'

这给出了预期的结果,selecting 来自 Bar 的特定属性,同时可选择使用 Baz 扩展功能。然而,与子类化不同的是,我们无法访问 Foo 的属性。

Foo(dtype=Baz).a
# AttributeError: 'Baz' object has no attribute 'a'

有些情况下并不是所有的属性都需要,因此子类化 Foo(Baz) 不是首选。

在 Python 中完成此操作的惯用模拟是什么?

如果您真的想要 BarBaz 的实例,为什么要首先创建 Foo 的实例?相反,使 Foo 成为 BarBaz.

实例的工厂
class Bar:
    b = "bar"

class Baz(Bar):
    c = "baz"

class Foo:
    a = "foo"

    def __new__(cls, dtype=Bar):
        return dtype()

正如我在评论中提到的,只需使用普通继承。

class Foo:
    a = "foo"

class Bar(Foo):
    b = "bar"

class Baz(Foo):
    c = "baz"

# Example use
import random
class_to_instantiate = Bar if random.choice([True, False]) else Baz
print(class_to_instantiate().a)

产出

foo