python中自定義module的方法及注意事項

2021-09-19 12:58:59 字數 3140 閱讀 4461

在編寫python程式的過程中,不可避免的需要自定義一些python的類和函式。有時候定義的函式太多,就要根據用途放到不同的module(模組)中去,專案更大時,需要將這些module再分類,放到不同的package(包)中,以方便管理。

可以這樣理解,module就是*.py檔案,裡面定義了一些類,函式及變數,可以被其他程式呼叫;將不同的module整合到乙個資料夾中,就得到了package,為了實現對其中的module的管理,package中往往需要有乙個__init__.py檔案。

這種方法是最直觀、最簡單的,也是我目前為止使用頻率最高的。在python中,每乙個*.py檔案都可以被其他的python程式所引用。如圖1,在pycharm中我建立了乙個python_module_test的專案:

現在裡面只有兩個檔案:my_module.pyrun.py,其**分別為:

# my_module.py

import time as t

var1 = t.time(

)var2 =

'this is a long string'

var3 =

89

# run.py

from my_module import

*print

(var1)

print

(var2)

print

(var3)

print

(t.time(

))

在python視窗執行run.py後,列印如下資訊:

很明顯,run.py指令碼匯入了my_module.py中的所有的變數(var1var2var3)及my_module.py中匯入的包(t)。

上面的例子中,run.pymy_module.py在同一級目錄下,呼叫起來沒什麼問題,但如果my_module.py在乙個資料夾中,該如何處理呢?

更改專案結構如下:

python_module_test

├──pkg

│ └──my_module.py

└──run.py

然後注意修改一下run.py中的第一**行為from pkg.my_module import *

按照我在網上查的大部分資料的說法,這個時候python並不會將pkg這個目錄視為包,因為其中缺少__init__.py檔案。那麼我們來實際執行一下吧:

這次我直接在terminal視窗執行的python run.py命令,輸出正常。那麼互動式執行的結果呢?

可以看出,仍然可以執行。

這是否就說明乙個package中__init__.py檔案的存在與否是無關緊要的呢?顯然,並不是這樣的,為了說明這一點,先看一下python中有哪些匯入方式。

在上面的例子中,我們都是用的from something import *的方式進行匯入模組和變數,另外的一種匯入方式就是import something as sth。下面總結一下這兩種匯入方式的注意點,這裡參考了這篇部落格的內容。

總的來看,匯入語句或者為import ...的形式,或者為from ... import ...的形式。

from ...匯入方式中,有一種不被推薦的寫法就是from a import *,這可能會導致變數的衝突,但是當你十分清楚a中的所有模組(變數)時,這樣做並沒有什麼問題。仍然以上文中的專案結構為例,在python命令框執行以下**會報錯:

這說明,python並沒有將模組module.py匯入到環境中去,解決的辦法,就是為包pkg新增__init__.py檔案,對該包中的模組等資源進行管理。修改後的專案結構如下:

python_module_test

├──pkg

│ ├──__init__.py

│ └──my_module.py

└──run.py

其中,__init__.py的內容為:

# __init__.py

__all__=

['my_module'

]

這時,再執行上述**,結果如下:

這說明,__init__.py檔案中的__all__引數控制該包中哪些模組(變數)可以以from pkg import *的方式匯入被匯入。使用者也可以在__init__.py檔案中定義其他的變數、類以及函式,然後將這些名字以字串新增到__all__列表中,這樣在就可以被匯入到執行環境中去。

自定義引數 Python自定義函式引數

1.種類 1 位置引數 x就是位置引數 usr bin env python coding utf 8 def power x result x x print result 2 預設引數n就是預設引數 usr bin env python coding utf 8 def power x,n 1 ...

Python中引用自定義模組

學習了一小段時間的python,始終停滯在簡單的語法上,不能真正體會到python的強大之處。今天學習了自定義模組的引用方法。當引用模組時,編譯器會先在當前目錄,接著去sys.path python的安裝目錄去尋找你引用的模組,如果沒有的話,就會報錯。第一種情況,你的模組和你要使用的模組在同一目錄下...

python中自定義排序函式

python內建的 sorted 函式可對list進行排序 sorted 36,5,12,9,21 5,9,12,21,36 但 sorted 也是乙個高階函式,它可以接收乙個比較函式來實現自定義排序,比較函式的定義是,傳入兩個待比較的元素 x,y,如果 x 應該排在 y 的前面,返回 1,如果 x...