包(package)
定義:
通過使用’.模塊名’來組織Python模塊名稱空間的方式。具體而言,包就是一個包括__init__.py
文件的文件夾。
目的:
用文件夾將文件/模塊組織起來。創建包不是爲了運行,而是爲了被導入使用,包的本質依然還是模塊(module)。
注意:
-
在
py3
,即使包中沒有__init__.py
也可以使用;py2
中如果沒有__init__.py
會報錯 -
使用時。import導入,導入帶點(.)的,點的左邊(前部分)一定是包名。
-
import導入文件時,產生名稱空間的名字源於文件,import包,名稱空間由於文件(包),
__init__.py
,導入包的本質就是導入它。
應用
導入包裏子包下的一個模塊
- 創建school包,其下創建3個子包(子包包含各自子模塊),在與school同級還有1個
text.py
調用school包
[外鏈圖片轉存失敗(img-ge3g2w81-1564046331356)(C:\Users\12273\Desktop\截圖.png)]
部分子模塊的內容:
#####manage.py######
def main():
print('from manage.py')
######students.py#######
def get():
print('from students.py')
- 在
text.py
想要調用cmd
下的manage的main
from school.cmd import manage
manage.main()
#結果: from manage.py
########如果直接import school
import school
school.cmd.manage.main()
##會直接報錯,因爲單獨導入包時,不會導入該包中所包含的所有子模塊
- 在
text.py
想要只通過import就調用students的get
#####在api的__init__裏#####
from . import students ###將api下的子模塊students導入api
#####z在school的__init__裏#####
from . import api ####將school下的子包api導入school
#####直接在text.py####
import school
school.api.students.get()
#結果: from students.py
綜上,當只導入一個包,沒有直接導入該包下的子包或子模塊,想訪問子包子模塊下的內容,可以通過上述的方法
導入包裏子包下的多個模塊
__all__
與*號的對應
*號會導入對應__init__
裏的所有內容
在api
下的__init__
裏寫入
a=6688
def func():
print('api>>__init__.py')
__all__=['students','verions','a','func']
在text.py裏
from school.api import *
students.get()
verions.create_resource('tt')
print(a)
func()
###結果
from students.py
from bersions.py tt
6688
api>>__init__.py
*'import '對應該包下的__all__
裏的內容,當在__all__
裏把func
去掉,再直接運行,會報錯
#######api下的__init__######
a=6688
def func():
print('api>>__init__.py')
__all__=['students','verions','a']
######text中######
from school.api import *
students.get()
verions.create_resource('tt')
print(a)
func()
#####結果:
from students.py
from bersions.py tt
6688
Traceback (most recent call last):
func()
NameError: name 'func' is not defined
相同的把school裏的__init__
裏的‘import’改成__all__
的形式
#####school下的__init__#####
__all__=['api','cmd','db']
#######text.py########
from school import *
api.func()
cmd.manage.main()
db.models.register_models('111')
#####結果:
api>>__init__.py
from manage.py
from model.py 111
在模塊中導入其他同級非同包的模塊
在student.py
導入manage.py
###在students.py
from school.cmd import manage ##絕對導入
manage.main()
#結果:from manage.py
#####在text中再調用
from school.api import students
students.manage.main()
#結果:from manage.py
字符編碼
引入
python只要識別文件的內容,而不是關係拓展名(.py
) ---->解釋器
字符>>機器翻譯>>二進制
字符如何對應特點數字(二進制)的標準,這個標準就是字符編碼。
編碼方式:ASCII
,GBK
,Unicode
(萬國碼),UTF-8
(Unicode Transformation Format)等
- 對於英文字符:
1Bytes
- 中文字符:
3Bytes
- 對於其他偏僻字符,可能需要更多的
bytes
去存儲
對於內存而言都是以Unicode(萬國碼)
>>> '上'.encode('gbk')
b'\xc9\xcf' ###2個字節
>>> '上'.encode('utf-8')
b'\xe4\xb8\x8a' ###3個字節
es`
- 對於其他偏僻字符,可能需要更多的
bytes
去存儲
對於內存而言都是以Unicode(萬國碼)
>>> '上'.encode('gbk')
b'\xc9\xcf' ###2個字節
>>> '上'.encode('utf-8')
b'\xe4\xb8\x8a' ###3個字節