今日內(nèi)容:
1.循環(huán)導(dǎo)入問題
2.py文件兩種用途
3.模塊的搜索路徑優(yōu)先級
4.軟件開發(fā)的目錄規(guī)范
一、循環(huán)導(dǎo)入問題:
# m1.py
print("導(dǎo)入m1")
from m2 import y
x = 1
# m2.py
print("導(dǎo)入m2")
from m1 import x
y = 2
# run.py
import m1
該程序會直接報錯锹淌,因為我們在導(dǎo)入m1時匿值,還沒運行到x=1,就導(dǎo)入了m2赂摆,此時m2需要引用x挟憔,而x還沒有定義钟些。反之對y也是如此,m1要引用m2的y绊谭,此時m2還沒來得及定義y
'''
解決方法1:將導(dǎo)入模塊語句放在定義變量后政恍,缺點是使得程序的可讀性變差,因為我們導(dǎo)入模塊一般都在開頭
'''
#m1.py
print('正在導(dǎo)入m1')
x='1'
from m2 import y
#m2.py
print('正在導(dǎo)入m2')
y='2'
from m1 import x
'''
推薦方法
解決方法2:將導(dǎo)入模塊的代碼寫到函數(shù)中达传,在調(diào)用時篙耗,才去加載模塊
'''
#m1.py
print('正在導(dǎo)入m1')
def f1():
from m2 import y
print(x,y)
x = '1'
# f1()
#m2.py
print('正在導(dǎo)入m2')
def f2():
from m1 import x
print(x,y)
y = '2'
#run.py
import m1
m1.f1()
'''
二、py文件的兩種用途
在一個py文件中趟大,可以使用__name__的方法查看自己的屬性
1.當(dāng)文件被當(dāng)成腳本直接運行的時候鹤树,__name__的值為__main__
2.當(dāng)文件被當(dāng)成模塊導(dǎo)入時候,__name__的值為模塊名稱逊朽,如導(dǎo)入spam.py文件罕伯,__name__ = 'spam'
三、模塊搜索路徑與查找優(yōu)先級:
1.先從內(nèi)存中已經(jīng)導(dǎo)入的模塊里找
2.然后再查找內(nèi)置的模塊
3.最后去sys.path列表中存放的多個文件夾里依次檢索
利用sys模塊下的sys.path可以獲取一個列表叽讳,這個列表就是存放python查找導(dǎo)入模塊文件夾的列表
(1) 先從內(nèi)存中已經(jīng)導(dǎo)入的模塊里找
import mmm
mmm.f1()
import time
time.sleep(15)
print('='*50)
import mmm
mmm.f1()
(2) 然后再查找內(nèi)置的模塊
'''
sys.modules是一個全局字典追他,該字典是python啟動后就加載在內(nèi)存中。每當(dāng)程序員
導(dǎo)入新的模塊岛蚤,sys.modules都將記錄這些模塊邑狸。字典sys.modules對于加載模塊起到
了緩沖的作用。當(dāng)某個模塊第一次導(dǎo)入涤妒,字典sys.modules將自動記錄該模塊单雾。當(dāng)?shù)?二次再導(dǎo)入該模塊時,python會直接到字典中查找她紫,從而加快了程序運行的速度硅堆。
'''
import sys
print(sys.modules)
import sys
print(sys.path)
當(dāng)前執(zhí)行文件所在的文件夾
import logging
print(logging)
(3) 最后去sys.path列表中存放的多個文件夾里依次檢索
'''
當(dāng)我們有第三方模塊或者自定義模塊需要導(dǎo)入時,有下面兩種方法
'''
示例1:
import sys
print(sys.path)
sys.path.append(r'D:\python全棧15期\aaa\bbb')
import ccc
ccc.f1()
示例2:
import sys
print(sys.path)
import aaa.bbb.ccc as c
c.f1()
from aaa.bbb import ccc
ccc.f1()
四贿讹、軟件開發(fā)的目錄規(guī)范
一般要有一個啟動程序渐逃,如start.py,其中盡量不包含邏輯代碼民褂,只用來啟動程序
對于一個簡單的項目茄菊,還需要包含
1.存放核心代碼的文件
2.存放公用功能的模塊
3.配置文件
4.日志文件
將啟動文件直接放到程序目錄下,會使我們程序運行時赊堪,sys.path將主程序的文件路徑加載進(jìn)去面殖,方便其他文件導(dǎo)入模版