1 python模塊使用事項
1.1 python模塊導入只執行一次
描述
python模塊在首次導入時從上到下執行模塊內容,再次導入直接從內存取數據,不會再從上到下執行。
示例
# runonce.py
s='梯閱線條'
print('執行一次:{}'.format(s))
# idle執行下面語句
>>> import os
>>> path=r'E:\\documents\\F盤'
>>> os.chdir(path)
# 首次導入模塊,從上到下執行模塊內容
>>> import runonce as ro
執行一次:梯閱線條
>>> ro.s
'梯閱線條'
>>> ro.s='tyxt'
# 再次導入模塊,不執行模塊內容,直接從內存讀取
>>> import runonce as ro
>>> ro.s
'tyxt'
1.2 import和from是賦值語句
描述
python導入模塊的import和from都是隱性賦值語句。類似def。
NO | 描述 |
---|---|
1 | import將模塊對象賦值給模塊名 |
2 | from將模塊屬性值賦給當前模塊的同名變量。 |
修改導入模塊內的對象
NO | 操作 | 描述 |
---|---|---|
1 | 修改可變對象 | imort或from導入模塊,通過“模塊.屬性=值”或“變量=值”修改可變對象。 |
2 | 修改不可變對象 | import導入模塊,通過“模塊.屬性=值”修改不可變對象。 |
示例
# assing.py
s='梯閱線條'
L=[s,9555]
# idle執行下面語句
>>> import os
>>> path=r'E:\\documents\\F盤'
>>> os.chdir(path)
>>> from assign import s,L
>>> s,L
('梯閱線條', ['梯閱線條', 9555])
>>> s='tyxt';L[1]=2023
>>> import assign
# 導入可變對象被修改時,模塊內對象跟著被修改
>>> assign.s,assign.L
('梯閱線條', ['梯閱線條', 2023])
>>> s,L
('tyxt', ['梯閱線條', 2023])
# 使用import 模塊,再通過“模塊.屬性=值”修改模塊內不可變對象
>>> assign.s=s
>>> assign.s,assign.L
('tyxt', ['梯閱線條', 2023])
1.3 使用import場景
描述
如果導入的多個模塊中,存在同名屬性,則需使用import進行導入。
示例
# mod_5.py
def myprint(val):
print('在mod_5:{}'.format(val))
# mod_6.py
# mod_6.py
def myprint(val):
print('在mod_6:{}'.format(val))
# idle執行下面語句
>>> import os
>>> path=r'E:\\documents\\F盤'
>>> os.chdir(path)
>>> s='tyxt'
# from語句,多個模塊中,導入同名屬性,只會執行最后導入的屬性
>>> from mod_5 import myprint
>>> from mod_6 import myprint
>>> myprint(s)
在mod_6:tyxt
# import導入多個模塊中的同名屬性,通過“模塊.屬性”訪問各自同名屬性
>>> import mod_5,mod_6
>>> mod_5.myprint(s)
在mod_5:tyxt
>>> mod_6.myprint(s)
在mod_6:tyxt
2 python模塊命名空間
python模塊為.py文件,導入模塊會創建模塊對象,模塊文件的頂層變量為模塊屬性。
python的命名空間(namespace)是指從名稱到對象的映射。
對象=f(名稱),f為命名空間。
任何一個名稱,通過命名空間f,都能找到唯一一個對象與之對應。
python變量名的創建、修改和查找都是在命名空間進行的。
python模塊命名空間就是模塊對象存放全部模塊內變量名的場所。
任何一個模塊屬性名稱都可以通過模塊命名空間找到唯一一個對象與之對應。
通過“模塊.屬性名”或“屬性名”的方式進行訪問。
2.1 python模塊生成命名空間
描述
python模塊文件頂層變量名包括:函數名、類名、函數外部變量名、類外部變量名,都為模塊屬性。通過“模塊.變量名”方式訪問。
python模塊生成命名空間:
NO | 內容 | 描述 |
---|---|---|
1 | 首次導入執行模塊語句 | 首次導入模塊創建空模塊對象,從上到下執行模塊內語句。 |
2 | 頂層賦值語句為模塊屬性 | 頂層變量賦值語句的變量名成為模塊屬性,比如:=(def和class外的等于號)、def、class、import、from、as等 |
3 | dict獲取模塊命名空間 | 模塊命名空間為字典,通過dict獲取屬性及值。 |
示例
# modnames.py
print('執行模塊語句開始')
import sys
s='梯閱線條'
def modf():
x='modf'
class modc(object):
y='modc'
print('執行模塊語句結束')
# idle執行下面語句
>>> import os
>>> path=r'E:\\documents\\F盤'
>>> os.chdir(path)
# 從上到下執行模塊語句
>>> import modnames
執行模塊語句開始
執行模塊語句結束
# 頂層變量賦值成為屬性:import賦值語句
>>> modnames.sys
'sys' (built-in)>
# 頂層變量賦值成為屬性:def、class 外等于號 =
>>> modnames.s
'梯閱線條'
# 頂層變量賦值成為屬性:def 隱性賦值
>>> modnames.modf
<function modf at 0x0400DF18>
# 頂層變量賦值成為屬性:class 隱性賦值
>>> modnames.modc
<class 'modnames.modc'>
# 非頂層變量賦值不能成為屬性:def、class 內賦值
>>> modnames.x
Traceback (most recent call last):
File "", line 1, in
modnames.x
AttributeError: module 'modnames' has no attribute 'x'
>>> modnames.y
Traceback (most recent call last):
File "", line 1, in
modnames.y
AttributeError: module 'modnames' has no attribute 'y'
# 通過 __dict__ 字典存儲命名空間的屬性
>>> list(modnames.__dict__.keys())
['__name__', '__doc__', '__package__', '__loader__', '__spec__', '__file__', '__cached__', '__builtins__', 'sys', 's', 'modf', 'modc']
>>> modnames.__dict__['s']
'梯閱線條'
# __file__ : 獲取模塊文件路徑
>>> modnames.__dict__['__file__']
'E:\\\\documents\\\\F盤\\\\modnames.py'
2.2 python點號屬性名運算
python點號屬性名為表達式運算,返回和屬性名匹配的值。
NO | 內容 | 描述 |
---|---|---|
1 | 無點號,X | 簡單變量,按LEGB規則在當前作用域內搜索變量名X |
2 | 單點號,X.Y | 當前作用域搜索X,搜索對象X的Y屬性 |
3 | 多點號,X.Y.Z | 搜索對象X的Y屬性,搜索X.Y對象的Z屬性 |
點號運算適用于有屬性的任何對象,比如:方法、模塊、類等對象。
2.3 python導入作用域
描述
python作用域由程序位置決定,不受模塊導入和函數調用影響。
NO | 內容 | 描述 |
---|---|---|
1 | 被導入文件無法訪問進行導入的文件內的變量名 | mod2.py導入mod1.py,那么mod1.py是無法訪問mod2.py內的變量的。 |
2 | 函數無法訪問其他函數內的變量名,除法物理上的嵌套函數 | 函數fa()是無法方法函數fb()內的變量的,除非fa()是fb()的內部函數。 |
3 | 模塊無法訪問其他模塊內的變量名,除非導入模塊 | 模塊mod1.py是無法訪問模塊mod2.py內的變量的,除非模塊mod1.py導入模塊mod2.py |
示例
# mod_a.py
s='梯閱線條'
def modaf():
global s
s = 'tyxt'
# mod_b.py
s='軟件測試開發'
import mod_a
mod_a.modaf()
print(s,mod_a.s)
# idle執行下面語句
>>> import os
>>> path=r'E:\\documents\\F盤'
>>> os.chdir(path)
# 被導入的模塊 mod_a,不可訪問模塊 mod_b 的變量s
>>> import mod_b
軟件測試開發 tyxt
2.4 python模塊嵌套
描述
python模塊a導入模塊b,模塊b導入模塊c,那么模塊a可以訪問模塊c的屬性。
示例
# modc.py
s='modc'
# modb.py
s='modb'
import modc
print('modb執行 s:{}'.format(s))
print('modb執行 modc.s:{}'.format(modc.s))
# moda.py
s='moda'
import modb
print('moda執行 s:{}'.format(s))
print('moda執行 modb.s:{}'.format(modb.s))
print('moda執行 modb.modc.s:{}'.format(modb.modc.s))
# idle執行下面語句
>>> import os
>>> path=r'E:\\documents\\F盤'
>>> os.chdir(path)
>>> import moda
# moda 導入 modb,從上到下執行modb
modb執行 s:modb
modb執行 modc.s:modc
# 導入 moda, 從上到下執行 moda
moda執行 s:moda
moda執行 modb.s:modb
# 訪問通過modb導入的modc:modb.modc.s
moda執行 modb.modc.s:modc
3 python模塊重載
python模塊導入后,再次導入不會重新加載和執行模塊文件代碼。
python的reload函數,強制已加載的代碼重新加載和執行,讓模塊動態更新。
3.1 python模塊重載reload
用法
import moda
from importlib import reload
reload(moda)
描述
python的reload()函數需先從importlib導入。
reload**( moda )****:**moda為模塊對象,即需先導入moda才能進行reload。
NO | 描述 |
---|---|
1 | reload在當前命名空間執行新代碼,不會刪除重建命名空間。 |
2 | 執行有變化的頂層賦值語句。 |
3 | reload會更新import導入的客戶端的引用。 |
4 | reload不更新from導入的客戶端的引用,因為from是復制屬性,最新的值只有在from客戶端重啟后生效。 |
示例
# reloadmod.py
s='梯閱線條'
def reloadf():
print(s)
# idle執行下面語句
>>> import os
>>> path=r'E:\\documents\\F盤'
>>> os.chdir(path)
>>> from importlib import reload
# 未導入模塊不可進行 reload 操作
>>> reload(reloadmod)
Traceback (most recent call last):
File "" , line 1, in
reload(reloadmod)
NameError: name 'reloadmod' is not defined
>>> import reloadmod
>>> reloadmod.reloadf()
梯閱線條
# 修改reloadmod.py的 s=’tyxt’
# reloadmod.py
s='tyxt'
def reloadf():
print(s)
# idle執行下面語句
# import取內存的舊數據
>>> import reloadmod
>>> reloadmod.reloadf()
梯閱線條
# reload 執行更新的模塊文件
>>> reload(reloadmod)
'reloadmod' from 'E:\\\\documents\\\\F盤\\\\reloadmod.py'>
>>> reloadmod.reloadf()
tyxt
-
數據
+關注
關注
8文章
7067瀏覽量
89107 -
python
+關注
關注
56文章
4797瀏覽量
84745
發布評論請先 登錄
相關推薦
評論