包(基礎)

包(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個字節
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章