2016-10-23 87 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

完美謝謝!我會盡快接受答案 –