我正在尝试找到一种自然的机制,以实现在同一界面的各种实现之间的“编译时”切换(相同的'duck-type')。
假设我有两个带有一些工厂函数的类:
class Number1(object)
...
def fromBytes(byteArray):
...
class Number2(object)
...
def fromBytes(byteArray):
...
分别在Number1.py
和Number2.py
中定义,它们实现相同的功能。我想编写以下面的import
语句开头的客户端代码:
import Number
其中我的Number.py
模块只是一个文件,其中选择了实现(在Number1
和Number2
之间)。我最初想要取消Number.py
和:
import Number1 as Number
在我的客户端代码中。但是,我希望在项目的单个位置指定我选择的实现,而不是在多个客户端模块中复制该选项。
我想如下定义Number.py
:
# choose your implementation here
import Number1
Number = Number1
然而,这个解决方案迫使我让我的客户端模块以:
开头from Number import Number
看起来不太好。我想要一个简单的import Number
,然后将我的工厂函数称为Number.ZERO
,Number.fromBytes(...)
例如...... pythonic方法是什么?
答案 0 :(得分:3)
使用通配符导入可能是解决问题的最简单方法。
<强> Number.py:强>
if use_module_1:
from Number1 import *
else:
from Number2 import *
在所有客户端代码中:
import Number
# or
from Number import some_name
虽然通配符导入通常被认为是一种不好的做法,但这不是一个例子,因为您实际上希望使用来自Number
或{{{{}}的所有元素污染Number1
命名空间1}}。