2012-08-15 69 views
2

我想了一會兒,想不到更好的標題,對不起。Python導入是否實例化了一個神祕類?

我是Python的new'ish,和(像許多其他的似乎)我只是無法讓我的頭圍繞import

我想我理解'模塊'和'包',類和屬性等等。這是我需要澄清的一種特定行爲。

說我有一個文件,foo.py.它有一條線是:

x = 1 

如果在另一個文件中,我`進口富」,我可以引用X和,奇妙的是,在另一個文件我可以導入foo和現在這兩個文件可以共享X。爲簡單起見,爲了讓課堂脫離討論,我相信這是在文件之間共享屬性的pythonic方式。

下面是問題:當我import foo時,foo.py本身是(缺乏隱喻實例化由翻譯?

我意識到如果我defi ne是模塊中的一個類,它遵循傳統的規則,只有在明確這樣做的情況下才能實例化。但是,Python解釋器(通過import語句)在全局命名空間中實例化我的模塊實例是解釋屬性共享行爲的唯一方法。

這是真的嗎?半真的嗎?還是我在失落的土地上與Sleestaks徘徊?

回答

2

導入會創建「模塊」對象的實例。值得一提的是,這僅在模塊導入的第一次時才創建。下面的時間它是導入你得到原始的參考。您可以隨意創建自己的模塊對象。

import glob # Import any python module 
moduleType = type(glob) 

onTheFly = moduleType("OnTheFly", "Docstring for this module") 

雖然沒有太多的好處來創建這些。

+1

是的!很好的答案,這句話打破了我的心理障礙 - 「下面這段時間,它是進口的,你得到的是原件的參考。」這很好解釋,我希望這個簡單的原則在官方文檔中更加明顯。 – hikaru 2012-08-15 19:13:43

0

是的,的確如此。如果執行import foo模塊對象foo已安裝,並且文件的內容(例如類欄)將作爲該對象的成員添加。

4

當您導入模塊:

  1. 如果模塊尚未以前導入,該文件中解析,這是添加到sys.modules用鑰匙是從進口路徑的module對象PYTHONPATH到您的模塊
  2. 該模塊的對象(或它們的一些部件)在導入命名空間,別名的別名和對象被引用由您使用
import的具體形式來確定因此當您 import foo時,口譯員檢查 sys.modules以註冊名稱 foo。如果找到它,它將在 foo模塊的本地名稱空間中提供一個標籤 foo。如果不是,則搜索pythonpath,直到找到 foo模塊,將其解析爲 module對象,將該對象添加到 sys.modules,並在該模塊對象的本地名稱空間中添加標籤。

import foo as foof做同樣的事情,只有創建的本地命名空間標籤是fooffrom foo import x遵循相同的過程,直到在本地名稱空間中創建標籤和引用爲止,而是在foo模塊的屬性x的名稱空間中提供標籤xfrom foo import x as foox只是結合了2個想法。

使用類,您可以通過使用__module__屬性在樹中上下爬行來實際地瀏覽整個系統。

+0

這是一個有幫助和徹底的解釋,但@PeterShinners的答案確實打破了我的心理障礙。 – hikaru 2012-08-15 19:12:51

相關問題