【发布时间】:2019-09-23 13:49:59
【问题描述】:
我正在创建一个 Python 模块,要求该模块的最终用户可以选择一个类的特定实现,该类将被整个模块中的各种其他类使用(最好使用默认实现)。
一个限制是这个类嵌入在深层层次结构中。这是一个说明问题的最小示例:
class X():
pass
class Y():
pass
Z = X # or Z = Y
class A():
def __init__(self):
self.zoo = Z()
class B():
def __init__(self):
self.zoo = Z()
class C(B):
pass
出于本示例的目的,我使用了全局变量Z 来定义将选择哪个类。这确实不理想,需要用户在导入后monkey patch/更改全局变量。这也可以防止在同一个项目中混合不同的实现。
from my_module import A, B, C, Y, Z
Z=Y
class U():
def __init__():
self.foo = C()
解决此问题的首选方法是什么?我想避免将类作为构造函数参数传递,因为选择例如X 或 Y 应该链接到类而不是实例。由于 Python 不支持参数化导入,我考虑过装饰器和元类,但无法提出简洁的设计。
【问题讨论】:
-
任何实现都需要选择你想使用的类。或者你想做一个配置?
-
这种模式似乎容易出现细微的错误,当加载模块时执行某些代码时会发生细微的错误,默认为
Z值,而其他代码将使用修改后的Z值执行。 -
你可以工厂模式来创建和使用你在运行时需要的类
标签: python python-3.x metaprogramming