2016-10-23 42 views
0

我想找到一种自然机制来实现看起来像'编译时间'在同一接口的各种实现之间切换(同样的'鸭式')。使用模块别名在各种实现之间切换

假设我有两个类与一些工厂功能:

class Number1(object) 
    ... 

def fromBytes(byteArray): 
    ... 

class Number2(object) 
    ... 

def fromBytes(byteArray): 
    ... 
分别在 Number1.pyNumber2.py定义

,它实现了相同的功能。我想编写与以下import语句启动客户端代码:

import Number 

在我的Number.py模块仅仅是其中执行的选择(之间说Number1Number2制成)的文件。我最初是想与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方式来做到这一点?

回答

3

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

Number.py:

if use_module_1: 
    from Number1 import * 
else: 
    from Number2 import * 

在所有客户端代码:

import Number 
# or 
from Number import some_name 

虽然通配符进口通常被认为是不好的做法,这不是一个情况在这里,因为你实际上希望污染Number命名空间与所有元素从Number1Number2

+0

完美谢谢!我会尽快接受答案 –