# 1. 從乙個模組中匯入指定的類或者方法
form a import b
# 2. 從乙個模組中匯入全部
from a import
*
筆者之前根據這兩個知識點,從其表面意思理解, 忽略了該細節。
該細節是:第二種方式,匯入全部,是真的匯入全部(當然除了if __name__ == '__main__'
裡面的東西)。而第一種方式,確不僅僅只匯入了指定的類和方法,還會執行在函式和類範圍外**。
舉例說明:
有個名命為a的模組,內容如下
我們從另乙個模組中import這個模組:
忽略這個細節之前,我會認為上圖的**執行後,只會輸出:22222222222222222222222
但實際的輸出是:
所以,可以總結:
form a import b這種方式,當該語句被執行時,會執行a模組中除了類和方法以及if __name__ == '__main__'
之外的所有**。
這個細節,平時可能不會引出bug,但在一些編碼風格不好的程式中,就很容易埋雷。
因此,自省以下:
記住該知識點,當不幸爆雷時,可以很快定位問題。
最好不要在乙個模組中除了類中和方法中編寫具備業務功能的**。
即`irom x import *中 * 號的作用。
可能大家都能記住的是,*號意味著將乙個包裡的所有模組全部匯入,或者是將乙個模組裡的類和函式全部匯入。
並且從程式設計風格上提倡不建議使用from x import *這種方式。
而這裡需要記錄的乙個細節是,*號意味著可以直接使用目標函式的名字,而不用加字首。
比如:
import time
time.sleep(1)
# 程式設計風格上不建議的方式
form time import
*sleep(
1)
上面這個簡單到不像話的例子,僅僅是為了說明這一點:通過*號,我們可以預先不知道time模組中有個命名為sleep的方法,當import 之後,即可以在執行時呼叫它。
總結一下:通過號,我們可以使得python在當執行時才知道方法名的一些方法得到呼叫,執行一些在執行前未知命名的方法。即呼叫程式都不知道它要呼叫的目標名字,則在編寫程式時自然無法通過具體名字來匯入。
以下示例簡單介紹了這種使用場景:
先看**目錄:
lib 是乙個包,main.py是程式執行檔案。
lib包中有個test_lib.py模組,**如下:
# lib/test_lib.py
deftest_a()
:print
("test 11111111111111111111111111111"
)def
test_b()
:print
("test 22222222222222222222222222222"
)
lib包中有個__init__.py檔案,**如下:
# lib/__init__.py
from
.test_lib import
*
因為這裡不知道test_lib中有哪些函式或者類,且需要把所有函式和類全部匯入。所以用的*號
main.py**如下:
# main.py
from lib import
*def
exec_func
(execname)
:eval
(execname)
if __name__ ==
'__main__'
: exec_func(
"test_a()"
) exec_func(
"test_b()"
)
這裡也用的*號,且只能用星號,因為執行時傳入的肯定是單純的函式名,不可能指出這個函式來自哪個模組。
執行結果如下:
test 11111111111111111111111111111
test 22222222222222222222222222222
process finished with exit code 0
如果main.py中使用from lib import test_lib
,將報如下錯誤:
traceback (most recent call last)
: file "c:/users/卟知導/pycharmprojects/pythonproject/main.py"
, line 8,in
exec_func(
"test_a()"
) file "c:/users/卟知導/pycharmprojects/pythonproject/main.py"
, line 5
,in exec_func
eval
(execname)
file ""
, line 1,in
nameerror: name 'test_a'
isnot defined
**
看看from lib import test_lib 與 from lib import *的命名空間。
通過命名空間的值,當from test_lib import *時,我們可以直接使用『test_a』來呼叫test_a函式
Python import過程解析
模組 乙個.py檔案 包 乙個資料夾,裡面一定包括乙個 init py檔案,可能包括子包和模組 module.py a 1 print module.py test.py import module print module.a 執行test.py,執行結果 module.py 1結論 import...
python import模組方法
python語言中import的使用很簡單,直接使用import module name語句匯入即可。這裡我主要寫一下 import 的本質。模組 module 用來從邏輯 實現乙個功能 上組織python 變數 函式 類 本質就是 py檔案。檔案是物理上組織方式 module name.py 模組...
python import模組方法
python包含子目錄中的模組方法比較簡單,關鍵是能夠在sys.path裡面找到通向模組檔案的路徑。下面將具體介紹幾種常用情況 1 主程式與模組程式在同一目錄下 如下面程式結構 src mod1.py test1.py 若在程式test1.py中匯入模組mod1,則直接使用importmod1或fr...