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
非常感谢!我会尽快接受答案的谢谢!我会尽快接受答复