假設我們有兩個模塊A和B在Python中,我們如何使項目中的任何地方都可以訪問對象?
在模塊A,我們有
class Entity(object):
pass
obj = Entity()
現在我想導入的對象模塊B「OBJ」,也隨時隨地在我的項目
在模塊BI想要做這樣的事情
import obj
我們該如何做到這一點?我們怎樣才能把對象放在我們的環境中?
假設我們有兩個模塊A和B在Python中,我們如何使項目中的任何地方都可以訪問對象?
在模塊A,我們有
class Entity(object):
pass
obj = Entity()
現在我想導入的對象模塊B「OBJ」,也隨時隨地在我的項目
在模塊BI想要做這樣的事情
import obj
我們該如何做到這一點?我們怎樣才能把對象放在我們的環境中?
好吧,你可以做到這一點......但不要這樣做! 不要這樣做。
兩種方式,一種是清潔:
import sys
sys.modules['obj'] = 'something here'
import obj
print obj
print type(obj)
assert obj == 'something here', 'It is not what you expect!'
這種簡單的事情工作,但你可能有問題(和肯定會在某個時候)。例如reload(obj)
將無法正常工作......
的另一種方式,更安全,更清潔,但仍,沒有合適的方式來使用你的代碼:
__builtins__['obj'] = "something else"
# Used like this:
print obj # no need to import anything
這一個是更好的,因爲大家都希望(和應該期望)import
導入模塊或包,而不是你的對象。最後一種方法並不依賴於這個假設,即使開發者不知道這個對象來自何處,並且obj
可能會導致您的全局/本地命名空間發生衝突,這是由於未知(對開發人員)的原因。
你知道嗎,只需使用from B import obj
。你不需要這個。
不要這樣做。真。 – 2012-08-15 13:31:22
@NedBatchelder我不確定在這一點上我是否足夠強調:D,但我認爲這會讓OP更好地理解幕後發生的事情。我總是發現這些東西很有趣,但你是100%正確的:不要做。 – jadkik94 2012-08-15 19:37:52
你嘗試過'從一個import obj'嗎? :-)非常基本的Python東西,真的。 – 2012-08-15 12:12:50
我建議你先閱讀http://docs.python.org/tutorial/modules.html,在Stack Overflow的不太友好的一面開始給你提供反饋意見之前。 :-) – 2012-08-15 12:14:02
@MartijnPieters - 我認爲這個評論應該是一個答案。 – mgilson 2012-08-15 12:15:35