在 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 中完成此操作的惯用模拟是什么?
如果您真的想要 Bar
或 Baz
的实例,为什么要首先创建 Foo
的实例?相反,使 Foo
成为 Bar
和 Baz
.
实例的工厂
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
我想在实例化时从某些 类 中选择一个子类到 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 中完成此操作的惯用模拟是什么?
如果您真的想要 Bar
或 Baz
的实例,为什么要首先创建 Foo
的实例?相反,使 Foo
成为 Bar
和 Baz
.
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