1 python模塊使用事項(xiàng)
1.1 python模塊導(dǎo)入只執(zhí)行一次
描述
python模塊在首次導(dǎo)入時(shí)從上到下執(zhí)行模塊內(nèi)容,再次導(dǎo)入直接從內(nèi)存取數(shù)據(jù),不會(huì)再從上到下執(zhí)行。
示例
# runonce.py
s='梯閱線條'
print('執(zhí)行一次:{}'.format(s))
# idle執(zhí)行下面語句
>>> import os
>>> path=r'E:\\documents\\F盤'
>>> os.chdir(path)
# 首次導(dǎo)入模塊,從上到下執(zhí)行模塊內(nèi)容
>>> import runonce as ro
執(zhí)行一次:梯閱線條
>>> ro.s
'梯閱線條'
>>> ro.s='tyxt'
# 再次導(dǎo)入模塊,不執(zhí)行模塊內(nèi)容,直接從內(nèi)存讀取
>>> import runonce as ro
>>> ro.s
'tyxt'
1.2 import和from是賦值語句
描述
python導(dǎo)入模塊的import和from都是隱性賦值語句。類似def。
NO | 描述 |
---|---|
1 | import將模塊對(duì)象賦值給模塊名 |
2 | from將模塊屬性值賦給當(dāng)前模塊的同名變量。 |
修改導(dǎo)入模塊內(nèi)的對(duì)象
NO | 操作 | 描述 |
---|---|---|
1 | 修改可變對(duì)象 | imort或from導(dǎo)入模塊,通過“模塊.屬性=值”或“變量=值”修改可變對(duì)象。 |
2 | 修改不可變對(duì)象 | import導(dǎo)入模塊,通過“模塊.屬性=值”修改不可變對(duì)象。 |
示例
# assing.py
s='梯閱線條'
L=[s,9555]
# idle執(zhí)行下面語句
>>> 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
# 導(dǎo)入可變對(duì)象被修改時(shí),模塊內(nèi)對(duì)象跟著被修改
>>> assign.s,assign.L
('梯閱線條', ['梯閱線條', 2023])
>>> s,L
('tyxt', ['梯閱線條', 2023])
# 使用import 模塊,再通過“模塊.屬性=值”修改模塊內(nèi)不可變對(duì)象
>>> assign.s=s
>>> assign.s,assign.L
('tyxt', ['梯閱線條', 2023])
1.3 使用import場景
描述
如果導(dǎo)入的多個(gè)模塊中,存在同名屬性,則需使用import進(jìn)行導(dǎo)入。
示例
# 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執(zhí)行下面語句
>>> import os
>>> path=r'E:\\documents\\F盤'
>>> os.chdir(path)
>>> s='tyxt'
# from語句,多個(gè)模塊中,導(dǎo)入同名屬性,只會(huì)執(zhí)行最后導(dǎo)入的屬性
>>> from mod_5 import myprint
>>> from mod_6 import myprint
>>> myprint(s)
在mod_6:tyxt
# import導(dǎo)入多個(gè)模塊中的同名屬性,通過“模塊.屬性”訪問各自同名屬性
>>> import mod_5,mod_6
>>> mod_5.myprint(s)
在mod_5:tyxt
>>> mod_6.myprint(s)
在mod_6:tyxt
2 python模塊命名空間
python模塊為.py文件,導(dǎo)入模塊會(huì)創(chuàng)建模塊對(duì)象,模塊文件的頂層變量為模塊屬性。
python的命名空間(namespace)是指從名稱到對(duì)象的映射。
對(duì)象=f(名稱),f為命名空間。
任何一個(gè)名稱,通過命名空間f,都能找到唯一一個(gè)對(duì)象與之對(duì)應(yīng)。
python變量名的創(chuàng)建、修改和查找都是在命名空間進(jìn)行的。
python模塊命名空間就是模塊對(duì)象存放全部模塊內(nèi)變量名的場所。
任何一個(gè)模塊屬性名稱都可以通過模塊命名空間找到唯一一個(gè)對(duì)象與之對(duì)應(yīng)。
通過“模塊.屬性名”或“屬性名”的方式進(jìn)行訪問。
2.1 python模塊生成命名空間
描述
python模塊文件頂層變量名包括:函數(shù)名、類名、函數(shù)外部變量名、類外部變量名,都為模塊屬性。通過“模塊.變量名”方式訪問。
python模塊生成命名空間:
NO | 內(nèi)容 | 描述 |
---|---|---|
1 | 首次導(dǎo)入執(zhí)行模塊語句 | 首次導(dǎo)入模塊創(chuàng)建空模塊對(duì)象,從上到下執(zhí)行模塊內(nèi)語句。 |
2 | 頂層賦值語句為模塊屬性 | 頂層變量賦值語句的變量名成為模塊屬性,比如:=(def和class外的等于號(hào))、def、class、import、from、as等 |
3 | dict獲取模塊命名空間 | 模塊命名空間為字典,通過dict獲取屬性及值。 |
示例
# modnames.py
print('執(zhí)行模塊語句開始')
import sys
s='梯閱線條'
def modf():
x='modf'
class modc(object):
y='modc'
print('執(zhí)行模塊語句結(jié)束')
# idle執(zhí)行下面語句
>>> import os
>>> path=r'E:\\documents\\F盤'
>>> os.chdir(path)
# 從上到下執(zhí)行模塊語句
>>> import modnames
執(zhí)行模塊語句開始
執(zhí)行模塊語句結(jié)束
# 頂層變量賦值成為屬性:import賦值語句
>>> modnames.sys
'sys' (built-in)>
# 頂層變量賦值成為屬性:def、class 外等于號(hào) =
>>> modnames.s
'梯閱線條'
# 頂層變量賦值成為屬性:def 隱性賦值
>>> modnames.modf
<function modf at 0x0400DF18>
# 頂層變量賦值成為屬性:class 隱性賦值
>>> modnames.modc
<class 'modnames.modc'>
# 非頂層變量賦值不能成為屬性:def、class 內(nèi)賦值
>>> 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__ 字典存儲(chǔ)命名空間的屬性
>>> 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點(diǎn)號(hào)屬性名運(yùn)算
python點(diǎn)號(hào)屬性名為表達(dá)式運(yùn)算,返回和屬性名匹配的值。
NO | 內(nèi)容 | 描述 |
---|---|---|
1 | 無點(diǎn)號(hào),X | 簡單變量,按LEGB規(guī)則在當(dāng)前作用域內(nèi)搜索變量名X |
2 | 單點(diǎn)號(hào),X.Y | 當(dāng)前作用域搜索X,搜索對(duì)象X的Y屬性 |
3 | 多點(diǎn)號(hào),X.Y.Z | 搜索對(duì)象X的Y屬性,搜索X.Y對(duì)象的Z屬性 |
點(diǎn)號(hào)運(yùn)算適用于有屬性的任何對(duì)象,比如:方法、模塊、類等對(duì)象。
2.3 python導(dǎo)入作用域
描述
python作用域由程序位置決定,不受模塊導(dǎo)入和函數(shù)調(diào)用影響。
NO | 內(nèi)容 | 描述 |
---|---|---|
1 | 被導(dǎo)入文件無法訪問進(jìn)行導(dǎo)入的文件內(nèi)的變量名 | mod2.py導(dǎo)入mod1.py,那么mod1.py是無法訪問mod2.py內(nèi)的變量的。 |
2 | 函數(shù)無法訪問其他函數(shù)內(nèi)的變量名,除法物理上的嵌套函數(shù) | 函數(shù)fa()是無法方法函數(shù)fb()內(nèi)的變量的,除非fa()是fb()的內(nèi)部函數(shù)。 |
3 | 模塊無法訪問其他模塊內(nèi)的變量名,除非導(dǎo)入模塊 | 模塊mod1.py是無法訪問模塊mod2.py內(nèi)的變量的,除非模塊mod1.py導(dǎo)入模塊mod2.py |
示例
# mod_a.py
s='梯閱線條'
def modaf():
global s
s = 'tyxt'
# mod_b.py
s='軟件測(cè)試開發(fā)'
import mod_a
mod_a.modaf()
print(s,mod_a.s)
# idle執(zhí)行下面語句
>>> import os
>>> path=r'E:\\documents\\F盤'
>>> os.chdir(path)
# 被導(dǎo)入的模塊 mod_a,不可訪問模塊 mod_b 的變量s
>>> import mod_b
軟件測(cè)試開發(fā) tyxt
2.4 python模塊嵌套
描述
python模塊a導(dǎo)入模塊b,模塊b導(dǎo)入模塊c,那么模塊a可以訪問模塊c的屬性。
示例
# modc.py
s='modc'
# modb.py
s='modb'
import modc
print('modb執(zhí)行 s:{}'.format(s))
print('modb執(zhí)行 modc.s:{}'.format(modc.s))
# moda.py
s='moda'
import modb
print('moda執(zhí)行 s:{}'.format(s))
print('moda執(zhí)行 modb.s:{}'.format(modb.s))
print('moda執(zhí)行 modb.modc.s:{}'.format(modb.modc.s))
# idle執(zhí)行下面語句
>>> import os
>>> path=r'E:\\documents\\F盤'
>>> os.chdir(path)
>>> import moda
# moda 導(dǎo)入 modb,從上到下執(zhí)行modb
modb執(zhí)行 s:modb
modb執(zhí)行 modc.s:modc
# 導(dǎo)入 moda, 從上到下執(zhí)行 moda
moda執(zhí)行 s:moda
moda執(zhí)行 modb.s:modb
# 訪問通過modb導(dǎo)入的modc:modb.modc.s
moda執(zhí)行 modb.modc.s:modc
3 python模塊重載
python模塊導(dǎo)入后,再次導(dǎo)入不會(huì)重新加載和執(zhí)行模塊文件代碼。
python的reload函數(shù),強(qiáng)制已加載的代碼重新加載和執(zhí)行,讓模塊動(dòng)態(tài)更新。
3.1 python模塊重載reload
用法
import moda
from importlib import reload
reload(moda)
描述
python的reload()函數(shù)需先從importlib導(dǎo)入。
reload**( moda )****:**moda為模塊對(duì)象,即需先導(dǎo)入moda才能進(jìn)行reload。
NO | 描述 |
---|---|
1 | reload在當(dāng)前命名空間執(zhí)行新代碼,不會(huì)刪除重建命名空間。 |
2 | 執(zhí)行有變化的頂層賦值語句。 |
3 | reload會(huì)更新import導(dǎo)入的客戶端的引用。 |
4 | reload不更新from導(dǎo)入的客戶端的引用,因?yàn)閒rom是復(fù)制屬性,最新的值只有在from客戶端重啟后生效。 |
示例
# reloadmod.py
s='梯閱線條'
def reloadf():
print(s)
# idle執(zhí)行下面語句
>>> import os
>>> path=r'E:\\documents\\F盤'
>>> os.chdir(path)
>>> from importlib import reload
# 未導(dǎo)入模塊不可進(jìn)行 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執(zhí)行下面語句
# import取內(nèi)存的舊數(shù)據(jù)
>>> import reloadmod
>>> reloadmod.reloadf()
梯閱線條
# reload 執(zhí)行更新的模塊文件
>>> reload(reloadmod)
'reloadmod' from 'E:\\\\documents\\\\F盤\\\\reloadmod.py'>
>>> reloadmod.reloadf()
tyxt
-
數(shù)據(jù)
+關(guān)注
關(guān)注
8文章
7085瀏覽量
89239 -
python
+關(guān)注
關(guān)注
56文章
4800瀏覽量
84834
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論