高性能、封装性(可复用)、抽象
Python项目的组织结构:
- 最顶级的组织结构:包(文件夹)
- 第二层级:模块(.py文件)
- 第三层级:类
- 第四层级:函数、变量
Python包与模块的名字
区分不同包的同名模块:包名.模块名
形成的模块的路径叫做命名空间
一个包下面可以有子包,模块可以和包平级
普通文件夹想要变成包必须要有__init__.py文件, __init__.py本身也是一个模块,可以不写内容只是标注包
特殊地,__init__.py模块的名字就是包名
import导入模块
利用 import 模块名 导入
#test1.c1
a = 1
#test1.c2
import c1
print(c1.a)
#1
import导入的总是模块,需要用模块名.变量名的方法引用
可以用as简化书写
#test1.c2
import c1 as m
print(m.a)
from import 导入变量
注意此处导入变量之后,就可以直接使用变量,不用加前面的命名空间了
#test1.c2
from c1 import a
print(a)
也可以from 包 import 模块,引用时用 模块.变量
引用大量变量时使用 * :
#test1.c1
a = 1
b = 2
c = 3
d = 4
#test1.c2
from c1 import *
print(a)
print(b)
print(c)
print(d)
控制*的行为:
#test1.c1
__all__ = ['a','c'] #用内置变量__all__来控制*的选择范围
a = 1
b = 2
c = 3
d = 4
#test1.c2
from c1 import *
print(a)
print(c)
print(d) #d没有被打印,报错
隐藏__pycache__文件夹
代码换行:在上一行末尾加上\或者加上括号利用括号的特性换行
from c1 import (a,b,
c)
from c1 import a,b,\
c
__init__.py 文件
当包被导入时,__init__.py会首先自动被执行
#test1.__init__.py
a = 'This is a __init__.py file'
print(a)
#c8.py
import test1
#This is a __init__.py file
__init__.py的应用场景:
1. 内置变量 __all__ 来控制 * 的导入模块,初始化
#seven/t/c7.py
a = 1
#seven/t/c8.py
b = 2
#seven/t/__init__.py
__all__ = ['c7']
#seven/c8.py
from t import *
print(c7.a)
print(c8.b)
# PS D:\python_learning\seven> python c8.py
# 1
# Traceback (most recent call last):
# File "c8.py", line 4, in <module>
# print(c8.b)
# NameError: name 'c8' is not defined
2. 批量导入库
#test1.__init__.py
import sys #批量导入库
import datetime
import io
#c8.py
import test1
print(test1.sys.path)
包与模块的几个常见错误
- 包和模块是不会被重复导入的,只会执行一次(入口文件的概念)
- 避免循环导入,不要形成闭环
- 导入模块的时候会执行模块里所有的代码