目錄
提要:1、注意事項:
2、import
3、form...import...
4、__init__.py檔案
5、from glance.cpi import *
6、絕對匯入和相對匯入
7、單獨匯入包
包是一種通過使用『模組名』來組織python模組命名空間的方式。
無論是import形式還是from...import形式,凡是在匯入語句中(而不是在使用時)遇到帶點的,都要第一時間提高警覺:這是關於包才有的匯入語法
包的本質就是乙個包含__init__.py檔案的目錄。
包a和包b下有同名模組也不會衝突,如a.a與b.a來自倆個命名空間
glance/ #頂級包
├── __init__.py #初始化glance包
├── api #分包的api
│ ├── __init__.py
│ ├── policy.py
│ └── versions.py
├── cmd #分包的cmd
│ ├── __init__.py
│ └── manage.py
└── db #分包的db
├── __init__.py
└── models.py
1、關於包相關的匯入語句也分為import和from ... import ...兩種,但是無論哪種,無論在什麼位置,在匯入時都必須遵循乙個原則:凡是在匯入時帶點的,點的左邊都必須是乙個包,否則非法。可以帶有一連串的點,如item.subitem.subsubitem,但都必須遵循這個原則。
2、對於匯入後,在使用時就沒有這種限制了,點的左邊可以是包,模組,函式,類(它們都可以用點的方式呼叫自己的屬性)。
3、對比import item 和from item import name的應用場景:如果我們想直接使用name那必須使用後者。
我們在與包glance同級別的檔案中測試
import glance.db.models
glance.db.models.register_models('mysql')
需要注意的是from後import匯入的模組,必須是明確的乙個不能帶點,否則會有語法錯誤,如:from a import b.c是錯誤語法
我們在與包glance同級別的檔案中測試
from glance.db import models
models.register_models('mysql')
from glance.db.models import register_models
register_models('mysql')
不管是哪種方式,只要是第一次匯入包或者是包的任何其他部分,都會依次執行包下的__init__.py檔案(我們可以在每個包的檔案內都列印一行內容來驗證一下),這個檔案可以為空,但是也可以存放一些初始化包的**。
在講模組時,我們已經討論過了從乙個模組內匯入所有*,此處我們研究從乙個包匯入所有*。
此處是想從包api中匯入所有,實際上該語句只會匯入包api下__init__.py檔案中定義的名字,我們可以在這個檔案中定__all___:
#在__init__.py中定義
x=10
def func():
print('from api.__init.py')
__all__=['x','func','policy']
此時我們在於glance同級的檔案中執行from glance.api import *就匯入__all__中的內容(versions仍然不能匯入)。
我們的最頂級包glance是寫給別人用的,然後在glance包內部也會有彼此之間互相匯入的需求,這時候就有絕對匯入和相對匯入兩種方式:
絕對匯入:以glance作為起始
相對匯入:用.或者..的方式最為起始(只能在乙個包中使用,不能用於不同目錄內)
例如:我們在glance/api/version.py中想要匯入glance/cmd/manage.py
在glance/api/version.py
#絕對匯入
from glance.cmd import manage
manage.mann()
#相對匯入
from ..cmd import manage
manage.mann()
測試結果:注意一定要在於glance同級的檔案中測試
注意:在使用pycharm時,有的情況會為你多做一些事情,這是軟體相關的東西,會影響你對模組匯入的理解,因而在測試時,一定要回到命令列去執行,模擬我們生產環境,你總不能拿著pycharm去上線**吧!!!
特別需要注意的是:可以用import匯入內建或者第三方模組,但是要絕對避免使用import來匯入自定義包的子模組,應該使用from... import ...的絕對或者相對匯入,且包的相對匯入只能用from的形式。
比如我們想在glance/api/versions.py中匯入glance/api/policy.py,有的同學一瞅這倆模組是在同乙個目錄下,十分開心的就去做了,它直接這麼做
#在version.py中
import policy #請讀上面的加黑體字
policy.get()
沒錯,我們單獨執行version.py是一點問題沒有的,執行version.py的路徑搜尋就是從當前路徑開始的,於是在匯入policy時能在當前目錄下找到,但是你想啊,你子包中的模組version.py極有可能是被乙個glance包同一級別的其他檔案匯入,比如我們在於glance同級下的乙個test.py檔案中匯入version.py,如下:
from glance.api import versions
'''執行結果:
importerror: no module named 'policy'
''''''
分析:此時我們匯入versions在versions.py中執行
import policy需要找從sys.path也就是從當前目錄找policy.py,
這必然是找不到的
'''
單獨匯入包名稱時不會匯入包中所有包含的所有子模組,如:
#在與glance同級的test.py中
import glance
glance.cmd.manage.mann()
'''執行結果:
attributeerror: module 'glance' has no attribute 'cmd'
'''
解決方法:
#glance/__init__.py
from . import cmd
#glance/cmd/__init__.py
from . import manage
執行:
#在於glance同級的test.py中
import glance
glance.cmd.manage.mann()
千萬別問:__all__不能解決嗎,__all__是用於控制from...import * python中有關列表的基礎用法
list 列表 是 python 中使用最頻繁的資料型別。list 是python中最常用的複合型資料型別,是一種容器類資料,可以用來儲存各種型別資料。列表的特點 1.列表中的資料是有序的 2.列表中的資料都有索引 3.可對列表進行增刪改查操作 1 列表的聲名和賦值 聲名乙個空列表 list 1 l...
python基礎 包的使用
1.什麼是包 包的本質就是資料夾,它由乙個包含有 init py檔案的檔案加。包以及包下所有的檔案都是用來被匯入使用,沒有乙個檔案是用來直接執行,因為包是模組的一中通用表現形式之一。from.import 和 import 使用 2.為什麼要有包?方便於集中管理,方便於使用者 3.怎麼用 模組的使用...
python基礎 閉包
摘自廖雪峰老師的部落格 返回閉包時,返回函式中不要引用任何後續可能變化的變數 如果一定要引用,就在原返回函式中再定義乙個函式,用該函式中的引數繫結可能變化的變數的當前值。def count fs for i in range 1,4 def f return i i return fs f1,f2,...