Python 使用模块别名在各种实现之间切换

Python 使用模块别名在各种实现之间切换,python,python-3.x,Python,Python 3.x,我试图找到一种自然的机制来实现类似于“编译时”的在同一接口(相同的“鸭子类型”)的不同实现之间的切换 假设我有两个类和一些工厂函数: class Number1(object) ... def fromBytes(byteArray): ... class Number2(object) ... def fromBytes(byteArray): ... 分别在Number1.py和Number2.py中定义,实现相同的功能。我想编写以以下import语句

我试图找到一种自然的机制来实现类似于“编译时”的在同一接口(相同的“鸭子类型”)的不同实现之间的切换

假设我有两个类和一些工厂函数:

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

看起来不太好。我想要一个简单的
导入编号
,然后调用工厂函数作为
编号.ZERO
编号.fromBytes(…)
,例如。。。pythonic的方法是什么?

使用通配符导入可能是解决这个问题的最简单方法

Number.py:

if use_module_1:
    from Number1 import *
else:
    from Number2 import *
在所有客户端代码中:

import Number
# or
from Number import some_name

虽然通配符导入通常被认为是一种不好的做法,但这里的情况并非如此,因为实际上希望
Number
命名空间中的所有元素都来自
Number1
Number2

,使用通配符导入可能是最简单的解决方法

Number.py:

if use_module_1:
    from Number1 import *
else:
    from Number2 import *
在所有客户端代码中:

import Number
# or
from Number import some_name

虽然通配符导入通常被认为是一种不好的做法,但这里的情况并非如此,因为您实际上希望
Number
命名空间中的所有元素都来自
Number1
Number2

非常感谢!我会尽快接受答案的谢谢!我会尽快接受答复