其實網上Python教程挺多的,編寫你自己的模塊很簡單,這其實就是你一直在做的事情!這是因為每一個 Python 程序同時也是一個模塊。你只需要保證它以 .py
為擴展名即可。下面的案例會作出清晰的解釋。
案例(保存為 mymodule.py
):
def say_hi(): print('Hi, this is mymodule speaking.') __version__ = '0.1'
上方所呈現的就是一個簡單的模塊。正如你所看見的,與我們一般所使用的 Python 的程序相比其實並沒有什么特殊的區別。我們接下來將看到如何在其它 Python 程序中使用這一模塊。
要記住該模塊應該放置於與其它我們即將導入這一模塊的程序相同的目錄下,或者是放置在 sys.path
所列出的其中一個目錄下。
另一個模塊(保存為 mymodule_demo.py
):
import mymodule mymodule.say_hi() print('Version', mymodule.__version__)
輸出:
$ python mymodule_demo.py Hi, this is mymodule speaking. Version 0.1
它是如何工作的
你會注意到我們使用相同的點符來訪問模塊中的成員。Python 很好地重用了其中的符號,這充滿了“Pythonic”式的氣息,這使得我們可以不必學習新的方式來完成同樣的事情。
下面是一個使用 from...import
語法的范本(保存為 mymodule_demo2.py
):
from mymodule import say_hi, __version__ say_hi() print('Version', __version__)
mymodule_demo2.py
所輸出的內容與 mymodule_demo.py
所輸出的內容是一樣的。
在這里需要注意的是,如果導入到 mymodule 中的模塊里已經存在了 __version__
這一名稱,那將產生沖突。這可能是因為每個模塊通常都會使用這一名稱來聲明它們各自的版本號。因此,我們大都推薦最好去使用 import
語句,盡管這會使你的程序變得稍微長一些。
你還可以使用:
from mymodule import *
這將導入諸如 say_hi
等所有公共名稱,但不會導入 __version__
名稱,因為后者以雙下划線開頭。
警告:要記住你應該避免使用 import 這種形式,即 `from mymodule import `。
Python 之禪
Python 的一大指導原則是“明了勝過晦澀”2。你可以通過在 Python 中運行
import this
來了解更多內容。
python dir()函數
內置的 dir()
函數能夠返回由對象所定義的名稱列表。 如果這一對象是一個模塊,則該列表會包括函數內所定義的函數、類與變量。
該函數接受參數。 如果參數是模塊名稱,函數將返回這一指定模塊的名稱列表。 如果沒有提供參數,函數將返回當前模塊的名稱列表。
案例:
$ python >>> import sys # 給出 sys 模塊中的屬性名稱 >>> dir(sys) ['__displayhook__', '__doc__', 'argv', 'builtin_module_names', 'version', 'version_info'] # 此處只展示部分條目 # 給出當前模塊的屬性名稱 >>> dir() ['__builtins__', '__doc__', '__name__', '__package__','sys'] # 創建一個新的變量 'a' >>> a = 5 >>> dir() ['__builtins__', '__doc__', '__name__', '__package__', 'a'] # 刪除或移除一個名稱 >>> del a >>> dir() ['__builtins__', '__doc__', '__name__', '__package__']
它是如何工作的
首先我們看到的是 dir
在被導入的 sys
模塊上的用法。我們能夠看見它所包含的一個巨大的屬性列表。
隨后,我們以不傳遞參數的形式使用 dir
函數。在默認情況下,它將返回當前模塊的屬性列表。要注意到被導入模塊的列表也會是這一列表的一部分。
給了觀察 dir
函數的操作,我們定義了一個新的變量 a
並為其賦予了一個值,然后在檢查 dir
返回的結果,我們就能發現,同名列表中出現了一個新的值。我們通過 del
語句移除了一個變量或是屬性,這一變化再次反映在 dir
函數所處的內容中。
關於 del
的一個小小提示——這一語句用於刪除一個變量或名稱,當這一語句運行后,在本例中即 del a
,你便不再能訪問變量 a
——它將如同從未存在過一般。
要注意到 dir()
函數能對任何對象工作。例如運行 dir(str)
可以訪問 str
(String,字符串)類的屬性。
同時,還有一個 vars()
函數也可以返回給你這些值的屬性,但只是可能,它並不能針對所有類都能正常工作。