編寫你自己的Python模組

davidtim發表於2021-09-09

其實網上挺多的,編寫你自己的模組很簡單,這其實就是你一直在做的事情!這是因為每一個 Python 程式同時也是一個模組。你只需要保證它以 .py 為副檔名即可。下面的案例會作出清晰的解釋。

案例(儲存為 mymodule.py):

def say_hi():
    print('Hi, this is mymodule speaking.')

__version__ = '0.1'

上方所呈現的就是一個簡單的模組。正如你所看見的,與我們一般所使用的 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 來了解更多內容。

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() 函式也可以返回給你這些值的屬性,但只是可能,它並不能針對所有類都能正常工作。


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/3349/viewspace-2822535/,如需轉載,請註明出處,否則將追究法律責任。

相關文章