python 模块与包_Python 模块与包
模塊:一個模塊就是一個包含了python定義和聲明的文件,文件名就是模塊名字加上.py的后綴。
但其實import加載的模塊分為四個通用類別:
1、使用python編寫的代碼(.py文件)
2、已被編譯為共享庫或DLL的C或C++擴展
3、包好一組模塊的包
4、使用C編寫并鏈接到python解釋器的內置模塊
一、import語句
import語句作用就是用來導入模塊的,它可以出現在程序中的任何位置。
用法:
使用import語句導入模塊,import語句語法如下:
import module關鍵字 模塊名
使用方法例如:
import math #入導math模塊
math.floor() #調用math模塊中的floor()函數
如果要同時導入多個模塊,只需要在模塊名之前用逗號進行分隔:
import module1,module2,module3.......
同時導入多個模塊的方法,對于初學者來說可讀性和可理解性不如第一種好。所以想要導入多個模塊時,還是比較推薦用第一種方式,把每一個模塊都單獨進行一次導入,可能會感覺操作起來麻煩一些,但便于理解。
為模塊名起別名,相當于m1=1;m2=m1
import spam as sm
print(sm.money)
二、form…impot語句
form…impot語句也是導入模塊的一種方法,更確切的說是導入指定的模塊內的指定函數方法。
from-import語句語法
from module import name 關鍵字 模塊名 關鍵字 方法名
例如入導函數math模塊中的floor函數方法:
from math import floor
form…impot使用方法例如:
from math import floor #導入math模塊中的floor函數方法
floor() #調用floor()函數方法
三、模塊搜索路徑
python解釋器在啟動時會自動加載一些模塊,可以使用sys.modules查看在第一次導入某個模塊時(比如spam),會先檢查該模塊是否已經被加載到內存中(當前執行文件的名稱空間對應的內存),如果有則直接引用,如果沒有,解釋器則會查找同名的內建模塊,如果還沒有找到就從sys.path給出的目錄列表中依次尋找spam.py文件。所以總結模塊的查找順序是:內存中已經加載的模塊->內置模塊->sys.path路徑中包含的模塊
sys.path的初始化的值來自于:
The directory containing the input script (or the current directory when no file is specified).
PYTHONPATH (a list of directory names, with the same syntax as the shell variable PATH).
The installation-dependent default.
需要特別注意的是:我們自定義的模塊名不應該與系統內置模塊重名。雖然每次都說,但是仍然會有人不停的犯錯。
在初始化后,python程序可以修改sys.path,路徑放到前面的優先于標準庫被加載。
import sys
print(sys.modules)
#查詢結果
{'builtins': , 'sys': , '_frozen_importlib': , '_imp': ,
'_warnings': , '_thread': , '_weakref': , '_frozen_importlib_external':
, '_io': , 'marshal': , 'nt': ,
'winreg': , 'zipimport': , 'encodings': ,
'codecs': , '_codecs': , 'encodings.aliases': ,
'encodings.utf_8': , '_signal': , '__main__':
, 'encodings.latin_1': , 'io':
, 'abc': , '_weakrefset': ,
'site': , 'os': , 'errno': , 'stat': ,
'_stat': , 'ntpath': , 'genericpath': , 'os.path':
, '_collections_abc': , '_sitebuiltins':
'C:\\Python36\\lib\\_sitebuiltins.py'>, 'sysconfig': }
#排在前的目錄,優先被搜索
四、包的導入
包是一種通過使用‘.模塊名’來組織python模塊名稱空間的方式。
1. 無論是import形式還是from...import形式,凡是在導入語句中(而不是在使用時)遇到帶點的,都要第一時間提高警覺:這是關于包才有的導入語法
2. 包是目錄級的(文件夾級),文件夾是用來組成py文件(包的本質就是一個包含__init__.py文件的目錄)
3. import導入文件時,產生名稱空間中的名字來源于文件,import 包,產生的名稱空間的名字同樣來源于文件,即包下的__init__.py,導入包本質就是在導入該文件
強調:
1. 在python3中,即使包下沒有__init__.py文件,import 包仍然不會報錯,而在python2中,包下一定要有該文件,否則import 包報錯
2. 創建包的目的不是為了運行,而是被導入使用,記住,包只是模塊的一種形式而已,包即模塊
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
#文件內容
#policy.py
def get():
print('from policy.py')
#versions.py
def create_resource(conf):
print('from version.py: ',conf)
#manage.py
def main():
print('from manage.py')
#models.py
def register_models(engine):
print('from models.py: ',engine)
在glance下__init__.py添加:
from glance.api.policy import get
from glance.api.versions import create_resource
from glance.cmd.manage import main
from glance.db.models import register_models
注意事項
1.關于包相關的導入語句也分為import和from ... import ...兩種,但是無論哪種,無論在什么位置,在導入時都必須遵循一個原則:凡是在導入時帶點的,點的左邊都必須是一個包,否則非法。可以帶有一連串的點,如item.subitem.subsubitem,但都必須遵循這個原則。
2.對于導入后,在使用時就沒有這種限制了,點的左邊可以是包,模塊,函數,類(它們都可以用點的方式調用自己的屬性)。
3.對比import item 和from item import name的應用場景:
如果我們想直接使用name那必須使用后者。
五、絕對導入與相對導入
我們的最頂級包glance是寫給別人用的,然后在glance包內部也會有彼此之間互相導入的需求,這時候就有絕對導入和相對導入兩種方式:
絕對導入:以glance作為起始
相對導入:用.或者..的方式最為起始(只能在一個包中使用,不能用于不同目錄內)
例如:我們在glance/api/version.py中想要導入glance/cmd/manage.py
在glance/api/version.py
#絕對導入
from glance.cmd import manage
manage.main()
#相對導入
from ..cmd import manage
manage.main()
測試結果:注意一定要在于glance同級的文件中測試
from glance.api import versions
修改上面 用相對導入:
from .api.policy import get
from .api.versions import create_resource
from .cmd.manage import main
from .db.models import register_models
與50位技術專家面對面20年技術見證,附贈技術全景圖總結
以上是生活随笔為你收集整理的python 模块与包_Python 模块与包的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 锐龙7-7840h相当于英特尔多少 锐龙
- 下一篇: 燕云十六声如何制作火箭