在編寫python程式的過程中,不可避免的需要自定義一些python的類和函式。有時候定義的函式太多,就要根據用途放到不同的module(模組)中去,專案更大時,需要將這些module再分類,放到不同的package(包)中,以方便管理。
可以這樣理解,module就是*.py
檔案,裡面定義了一些類,函式及變數,可以被其他程式呼叫;將不同的module整合到乙個資料夾中,就得到了package,為了實現對其中的module的管理,package中往往需要有乙個__init__.py
檔案。
這種方法是最直觀、最簡單的,也是我目前為止使用頻率最高的。在python中,每乙個*.py
檔案都可以被其他的python程式所引用。如圖1,在pycharm中我建立了乙個python_module_test的專案:
現在裡面只有兩個檔案:my_module.py
和run.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
中的所有的變數(var1
、var2
、var3
)及my_module.py
中匯入的包(t
)。
上面的例子中,run.py
與my_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...