python核心編程--第十二章

12.2 模塊和文件 python

若是說模塊是按照邏輯來組織 Python 代碼的方法, 那麼文件即是物理層上組織模塊的方法。所以, 一個文件被看做是一個獨立模塊, 一個模塊也能夠被看做是一個文件。 模塊的文件名就是模塊的名字加上擴展名 .py 。 shell

當咱們要導入模塊的時候,須要知道模塊放在相應的路徑下才行。 安全

>>> import sys
>>> sys.path
['C:\\Python27\\Lib\\idlelib', 'C:\\Windows\\system32\\python27.zip', 'C:\\Python27\\DLLs', 'C:\\Python27\\lib', 'C:\\Python27\\lib\\plat-win', 'C:\\Python27\\lib\\lib-tk', 'C:\\Python27', 'C:\\Python27\\lib\\site-packages', 'C:\\Python27\\lib\\site-packages\\PIL', 'C:\\Python27\\lib\\site-packages\\win32', 'C:\\Python27\\lib\\site-packages\\win32\\lib', 'C:\\Python27\\lib\\site-packages\\Pythonwin', 'C:\\Python27\\lib\\site-packages\\wx-2.8-msw-ansi']
因此,你能夠直接執行程序將新的路徑添加進去便可。
sys.path.append('/home/wesc/py/lib')
使用 sys.modules 能夠找到當前導入了哪些模塊和它們來自什麼地方。 和 sys.path 不一樣,sys.modules 是一個字典, 使用模塊名做爲鍵( key) , 對應物理地址做爲值( value )

12.3 名稱空間

名稱空間是名稱(標識符)到對象的映射。 向名稱空間添加名稱的操做過程涉及到綁定標識符到指定對象的操做(以及給該對象的引用計數加 1 )。 《Python 語言參考》(Python Language Reference)有以下的定義: 改變一個名字的綁定叫作從新綁定, 刪除一個名字叫作解除綁定。 app

Python 解釋器首先加載內建名稱空間。 它由 __builtins__ 模塊中的名字構成。 隨後加載執行模塊的全局名稱空間, 它會在模塊開始執行後變爲活動名稱空間。 這樣咱們就有了兩個活動的名稱空間。 函數

核心筆記: __builtins__ 和 __builtin__
__builtins__ 模塊和 __builtin__ 模塊不能混淆。 雖然它們的名字類似——尤爲對於新手來講。 __builtins__ 模塊包含內建名稱空間中內建名字的集合。 其中大多數(若是不是所有的話)來自 __builtin__ 模塊, 該模塊包含內建函數, 異常以及其餘屬性。 在標準 Python 執行環境下,__builtins__ 包含 __builtin__ 的全部名字。 Python 曾經有一個限制執行模式, 容許你修改__builtins__ , 只保留來自 __builtin__ 的一部分, 建立一個沙盒(sandbox)環境。可是, 由於它有必定的安全缺陷, 並且修復它很困難, Python 已經再也不支持限制執行模式。(如版本2.3 ) ui

可是,我發現: spa

>>> __builtin__

Traceback (most recent call last):
  File "<pyshell#12>", line 1, in <module>
    __builtin__
NameError: name '__builtin__' is not defined
若是在執行期間調用了一個函數, 那麼將建立出第三個名稱空間, 即局部名稱空間。 咱們能夠經過 globals() 和 locals() 內建函數判斷出某一名字屬於哪一個名稱空間。

12.3.1 名稱空間與變量做用域比較 設計

下圖展現了名稱空間和變量做用域的關係: code

注意每一個名稱空間是一個自我包含的單元。但從做用域的觀點來看, 事情是不一樣的. 全部局部名稱空間的名稱都在局部做用範圍內。局部做用範圍之外的全部名稱都在全局做用範圍內。 orm

12.3.2 名稱查找,肯定做用域,覆蓋

那麼肯定做用域的規則是如何聯繫到名稱空間的呢? 它所要作的就是名稱查詢. 訪問一個屬性時, 解釋器必須在三個名稱空間中的一個找到它。 首先從局部名稱空間開始, 若是沒有找到, 解釋器將繼續查找全局名稱空間. 若是這也失敗了, 它將在內建名稱空間裏查找。 若是最後的嘗試也失敗了, 你會獲得這樣的錯誤:

>>> foo

Traceback (most recent call last):
  File "<pyshell#18>", line 1, in <module>
    foo
NameError: name 'foo' is not defined
這裏要注意一點:局部名稱會覆蓋全局,而全局會覆蓋內建。

12.3.3 無限制的名稱空間

class oneClass(object):
    pass
bar = oneClass()
bar.x = 100
bar.y = 200
bar.version = 0.1
bar.completed = False

print bar.x, bar.y, bar.version, bar.completed
程序輸出:
>>> 
100 200 0.1 False
固然,若是你這樣寫的話,會出錯的:
class oneClass(object):
    pass
bar = oneClass()
bar.x = 100
bar.y = 200
bar.version = 0.1
bar.completed = False

print bar.x, bar.y, bar.version, bar.completed

new_bar = oneClass()
print new_bar.x
程序異常:
>>> 
100 200 0.1 False

Traceback (most recent call last):
  File "C:\Python27\hello.py", line 12, in <module>
    print new_bar.x
AttributeError: 'oneClass' object has no attribute 'x'
你能夠把任何想要的東西放入一個名稱空間裏。
說實在的看到這裏我嚇了一跳。熟悉的C++裏面對封裝的嚴謹性要求很高,可是python竟然容許把想要的任何東西放進一個名詞空間中。

固然,思考了一下這樣作的好處就是:靈活了類的設計!!!

核心風格: import 語句的模塊順序 咱們推薦全部的模塊在 Python 模塊的開頭部分導入。 並且最好按照這樣的順序:

相關文章
相關標籤/搜索