python好用的模块和包_Python模块和包详细讲解与实例分析
一丶模塊
我們經(jīng)常說模塊模塊的,究竟什么是模塊呢?
一個(gè)模塊就是包含了Python定義和聲明的文件,文件名就是模塊名字加上.py的后綴
但其實(shí)import加載的模塊分為四個(gè)通用類別:
1.使用Python編寫的代碼(.py文件)
2.已被編譯為共享庫或DLL的C或C++擴(kuò)展
3.包好一組模塊的包
4.使用C編寫并鏈接到Python解釋器的內(nèi)置模塊
import
from?import導(dǎo)入的過程中發(fā)生了什么事兒?
1.找到要被導(dǎo)入的模塊
2.判斷這個(gè)模塊是否被導(dǎo)入過
3.如果這個(gè)模塊沒被導(dǎo)入
創(chuàng)建一個(gè)屬于這個(gè)模塊的命名空間
執(zhí)行這個(gè)文件
找到你要導(dǎo)入的變量
給你要導(dǎo)入的變量創(chuàng)建一個(gè)引用,指向你要導(dǎo)入的變量
自定義模塊:my_module.py,文件名my_module.py,模塊名?my_module
importsysprint(sys.modules) #導(dǎo)入的模塊會(huì)寫在這里面
sys.path.append(my_module) #將my_module模塊寫入里面
import my_module #導(dǎo)入my_module模塊
print(my_module.name) #調(diào)用my_module中的name
為模塊起別名
#給模塊起別名
importmy_moudle as m
m.read1#給模塊起別名,起了別名之后,使用這個(gè)模塊就都使用別名引用變量了
導(dǎo)入多個(gè)模塊
#導(dǎo)入多個(gè)模塊
importos,timeimportos as o,time as t#規(guī)范建議:先導(dǎo)入內(nèi)置模塊,再導(dǎo)入擴(kuò)展(第三方)模塊,再導(dǎo)入自定義模塊
from..import
from my_module importread1defread1():print('in my read1')from my_module importread2
read1()
需要特別強(qiáng)調(diào)的一點(diǎn)是:python中的變量賦值不是一種存儲(chǔ)操作,而只是一種綁定關(guān)系,如下:
from my_module importmoney,read1
money=100 #將當(dāng)前位置的名字money綁定到了100
print(money) #打印當(dāng)前的名字
read1() #讀取my_module.py中的名字money,仍然為1000
'''from the my_module.py
my_module->read1->money 1000'''
from?my_module?import *
from my_module import * #將模塊my_module中所有的名字都導(dǎo)入到當(dāng)前名稱空間
print(money)print(read1)print(read2)print(change)'''執(zhí)行結(jié)果:
from the my_module.py
'''
__all__能約束*導(dǎo)入的變量的內(nèi)容
__all__ = ['name','read1','read2']from my_module import *
print(name)
read1()
read2()
把模塊當(dāng)做腳本執(zhí)行
當(dāng)一個(gè)py文件
當(dāng)做一個(gè)腳本的時(shí)候:能夠獨(dú)立的提供一個(gè)功能,能自主完成交互
當(dāng)成一個(gè)模塊的時(shí)候,能夠被導(dǎo)入這個(gè)調(diào)用這個(gè)功能,不能自主交互
我們可以通過模塊的全局變量__name__來查看模塊名:
當(dāng)做腳本運(yùn)行:
__name__等于'__main__'
當(dāng)做模塊導(dǎo)入:
__name__=模塊名
作用:用來控制.py文件在不同的應(yīng)用場景下執(zhí)行不同的邏輯
if__name__=='__main__'
deffib(n):
a, b= 0, 1
while b
a, b= b, a+bprint()if __name__ == "__main__":print(__name__)
num= input('num :')
fib(int(num))
模塊搜索路徑
Python解釋器在啟動(dòng)時(shí)會(huì)自動(dòng)加載一些模塊,可以使用sys.modules查看
在第一次導(dǎo)入某個(gè)模塊時(shí)(比如my_module),會(huì)先檢查該模塊是否已經(jīng)被加載到內(nèi)存中,如果有則直接引用,如果沒有,解釋器則會(huì)查找同名的內(nèi)建模塊,如果還沒有找到就送sys.path給出的目錄列表中依次尋找my_module.py文件
所以總結(jié)模塊的查找順序是:內(nèi)存中已經(jīng)加載的模塊->內(nèi)置模塊->sys.path路徑中包含的模塊
importsysimportcalculateprint(sys.path)
path= r'D:Learnday21模塊的循環(huán)引用'sys.path.append(path)
編譯Python文件
1.如果是在命令中被直接導(dǎo)入模塊,則按照這種方式,每次導(dǎo)入都會(huì)重新編譯,并且不會(huì)存儲(chǔ)編譯后的結(jié)果
2.如果源文件不存在,那么緩存的結(jié)果也不會(huì)被使用,如果想在沒有源文件的情況下來使用編譯后的結(jié)果,則編譯后的結(jié)果必須在源目錄下
dir()函數(shù)
內(nèi)建函數(shù)dir是用來查找模塊中定義的名字,返回一個(gè)有序字符串列表.如果沒有參數(shù),dir()列舉出當(dāng)前定義的名字
importmy_module
dir(my_module)
二丶包
1.無論是import形式還是from...import形式,凡是在導(dǎo)入語句中(而不是在使用時(shí))遇到帶點(diǎn)的,都要第一時(shí)間提高警覺:這是關(guān)于包才有的導(dǎo)入語法
2.包是目錄級(jí)的(文件夾級(jí)),文件夾是用來組成py文件(包的本質(zhì)就是一個(gè)包含__init__.py文件的目錄)
3.import導(dǎo)入文件時(shí),產(chǎn)生名稱空間中的名字來源于文件,import包,產(chǎn)生的名稱空間的名字同樣來源于文件,即包下的__init__.py,導(dǎo)入包的本質(zhì)就是在導(dǎo)入該文件
強(qiáng)調(diào):
1.在Python3中,即使包下沒有__init__.py文件,import包仍然不會(huì)報(bào)錯(cuò),而在Python2中,包下一定要有該文件,否則import包報(bào)錯(cuò)
2.創(chuàng)建包的目的不是為了運(yùn)行,而是被導(dǎo)入使用,記住,包只是模式的一種形式而已,包即模塊
importos
os.makedirs('glance/api')
os.makedirs('glance/cmd')
os.makedirs('glance/db')
l=[]
l.append(open('glance/__init__.py','w'))
l.append(open('glance/api/__init__.py','w'))
l.append(open('glance/api/policy.py','w'))
l.append(open('glance/api/versions.py','w'))
l.append(open('glance/cmd/__init__.py','w'))
l.append(open('glance/cmd/manage.py','w'))
l.append(open('glance/db/models.py','w'))
map(lambda f:f.close() ,l)
創(chuàng)建目錄代碼
glance/ #Top-level package
├──__init__.py #Initialize the glance package
├── api#Subpackage for api
│ ├──__init__.py
│ ├── policy.py
│ └── versions.py
├── cmd#Subpackage for cmd
│ ├──__init__.py
│ └── manage.py
└── db#Subpackage for db
├──__init__.py
└── models.py
目錄結(jié)構(gòu)
#文件內(nèi)容
#policy.py
defget():print('from policy.py')#versions.py
defcreate_resource(conf):print('from version.py:',conf)#manage.py
defmain():print('from manage.py')#models.py
defregister_models(engine):print('from models.py:',engine)
文件內(nèi)容
在導(dǎo)入包時(shí)必須遵守一個(gè)原則:凡是在導(dǎo)入時(shí)帶點(diǎn)的,點(diǎn)的左邊都必須是一個(gè)包
from..import
需要注意的是from后導(dǎo)入的模塊,必須是明確的一個(gè)不能帶點(diǎn),否則會(huì)有語法錯(cuò)誤
from glance.db importmodels
models.register_models('mysql')from glance.db.models importregister_models
register_models('mysql')
import
importglance.db.models
glance.db.models.register_models('mysql')
__init__.py文件
不管是哪種方式,只要是第一次導(dǎo)入包或者包的任何其他部分,都會(huì)依次執(zhí)行包下的__init__.py文件,這個(gè)文件可以為空,但是也可以存在一些初始化包的代碼
from?glance.api?import *
此處是想從包api中導(dǎo)所有,實(shí)際上該語句只會(huì)導(dǎo)入包api下__init__.py文件中定義的名字,我們可以在這個(gè)文件中定義__all__:
#在__init__.py中定義
x=10
deffunc():print('from api.__init.py')__all__=['x','func','policy']
絕對(duì)導(dǎo)入和相對(duì)導(dǎo)入
絕對(duì)導(dǎo)入:以glance作為起始
相對(duì)導(dǎo)入:用.或者..的方式最為起始(只能在一個(gè)包中使用,不能用于不同的目錄內(nèi))
例如:我們?cè)趃lance/api/version.py中想要導(dǎo)入glance/cmd/manage.py
在glance/api/version.py#絕對(duì)導(dǎo)入
from glance.cmd importmanage
manage.main()#相對(duì)導(dǎo)入
from ..cmd importmanage
manage.main()
特別需要注意的是:可以用import導(dǎo)入內(nèi)置或者第三方模塊(已經(jīng)在sys.path中),但是要絕對(duì)避免使用import來導(dǎo)入自定義包的子模塊(沒有在sys.path中),應(yīng)該使用from... import ...的絕對(duì)或者相對(duì)導(dǎo)入,且包的相對(duì)導(dǎo)入只能用from的形式。
絕對(duì)導(dǎo)入:
glance/├──__init__.py from glance importapifrom glance importcmdfrom glance importdb
├── api
│ ├──__init__.py from glance.api importpolicyfrom glance.api importversions
│ ├── policy.py
│ └── versions.py
├── cmdfrom glance.cmd importmanage
│ ├──__init__.py
│ └── manage.py
└── dbfrom glance.db importmodels
├──__init__.py
└── models.py
絕對(duì)導(dǎo)入
絕對(duì)導(dǎo)入
相對(duì)導(dǎo)入:
glance/├──__init__.py from . import api #.表示當(dāng)前目錄
from . importcmdfrom . importdb
├── api
│ ├──__init__.py from . importpolicyfrom . importversions
│ ├── policy.py
│ └── versions.py
├── cmdfrom . importmanage
│ ├──__init__.py
│ └── manage.pyfrom ..api importpolicy#..表示上一級(jí)目錄,想再manage中使用policy中的方法就需要回到上一級(jí)glance目錄往下找api包,從api導(dǎo)入policy
└── dbfrom . importmodels
├──__init__.py
└── models.py
相對(duì)導(dǎo)入
相對(duì)導(dǎo)入
單獨(dú)導(dǎo)入包
單獨(dú)導(dǎo)入包名稱時(shí)不會(huì)導(dǎo)入包中所有包含的所有子模塊,如:
#在與glance同級(jí)的test.py中
importglance
glance.cmd.manage.main()'''執(zhí)行結(jié)果:
AttributeError: module 'glance' has no attribute 'cmd''''
解決方法:
#glance/__init__.py
from . importcmd#glance/cmd/__init__.py
from . import manage
執(zhí)行:
#在于glance同級(jí)的test.py中
importglance
glance.cmd.manage.main()
import?glance?之后直接調(diào)用模塊中的方法
glance/├──__init__.py from .api import *
from .cmd import *
from .db import *├── api
│ ├──__init__.py __all__ = ['policy','versions']
│ ├── policy.py
│ └── versions.py
├── cmd__all__ = ['manage']
│ ├──__init__.py
│ └── manage.py
└── db__all__ = ['models']
├──__init__.py
└── models.pyimportglance
policy.get()import glance
View Code
軟件開發(fā)規(guī)范
總結(jié)
以上是生活随笔為你收集整理的python好用的模块和包_Python模块和包详细讲解与实例分析的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python列表操作程序_Python列
- 下一篇: mysql锁表_MySQL中Alter