包(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个字节