包(基础)

包(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个字节
上一篇:Spring全家桶之spring boot(二)


下一篇:A+B for Input-Output Practice (VI)