python 包的有關基礎

2021-09-08 08:02:33 字數 3759 閱讀 9473

目錄

提要: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,...