Learning Python Part III 之 模塊的使用

先簡單創建一個模塊文件作爲例子:

#module1.py
def printer(x):
    print(x)

import 語句

>>> import module1
>>> module1.printer('Hello world!')
Hello world!

from 語句

因爲from直接從一個文件中拷貝一個特定的名字到其它作用域,它允許我們在代碼中直接使用拷貝的名字而不需要通過模塊:

>>> from module1 import printer
>>> printer('Hello world!')
Hello world!

from的格式允許我們拷貝多個名字,中間用逗號隔開。這個和import有同樣的效果,不過因爲被導入的名字被拷貝進了from語句出現的作用域裏,使用這樣的變量名不需要打太多字——我們可以直接只用而不是通過模塊導入。事實上,from並不會賦值模塊本身的名字。
正如之前的細節,from語句只是import語句的擴展——它需要導入整個文件,進行三步操作,但是有額外的一步,就是複製出一個或多個名字(不是對象)。儘管加載了整個模塊,但可以更直接的訪問其中的名字。

from * 語句

在from語句中當我們使用*而不是特定的名字,我們會得到被引用模塊中的所有名字,和from一樣,我們可以在代碼中直接使用printer:

>>> from module1 import *
>>> printer('Hello world!')
Hello world!

Import只發生一次

當人們開始使用模塊之後問的最多的問題之一就是“爲什麼我的Import不能正常工作,他們經常報告說第一次Import 運行的很好,但是之後在同一過程中的運行並不是很有效。下面就是原因:
模塊會在第一次import 或者from時被加載和運行,並且僅這一次。這是有原因的——因爲import是一個很昂貴的操作,Python默認每個文件每個進程只會運行一次,之後的引用操作只會去匹配已經加載的模塊對象。

初始化代碼

因爲一個模塊文件中的代碼通常只會執行一次,你可以用它來初始化變量,例如:

#simple.py
print('hello')
spam = 1

在這個例子中,print和=在模塊第一次被導入的時候被執行,變量spam是在導入時被初始化的:

% python
>>> import simple
hello
>>> simple.spam
1

第二次和之後的導入並不會重新運行模塊的代碼,它僅僅從Python內部的模塊表匹配已經創立的模塊對象。因此,變量spam不能被重新初始化:

>>> simple.spam = 2
>>> import simple
>>> simple.spam
2

當然,有時候你希望在後續的引用中重新運行模塊代碼,這就需要用到Python的reload函數。

import和from是賦值

就像def,import和from是可執行的語句,不是編譯聲明。他們可以被嵌套在if結構中,在不同的操作中選擇;出現在def裏,只在被調用的時候加載;在try語句塊裏使用,提供默認選項;等等。當程序運行時,只有當Python到達它們的時候纔會被運行。換句話說,只有當相關的import和from語句運行到的時候被引用的模塊和名字纔可用。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章