一.python项目组织结构
- 包——相对于文件夹
- 模块——相当于文件夹下面的文件
- 类——函数、变量
一个模块中可以写多个类
1.包和模块的命名
区分不同包的同名模块,比如
seven.c4 \ six.c4 即命名空间。
一个包下,还可以有子包,模块可以与子包平级。
包在物理表现下是一个文件夹,但文件夹并不等同于包。
文件夹必须包含__init__.py才能等同于包。
__init__.py也是一个包,它的名字就是包的名字seven!
2.导入模块
(1)import导入模块
import 包名.模块名
如果想要某个模块中的内容在其他模块里也能使用,就需要进行模块的导入
可以使用import来导入模块,只能导入模块
格式为:import 模块名(要求两模块必须在同一个包等级下)
如果不在同一等级下,则应该写为 import 包名.模块名
在导入后,想要引用模块下的某个变量可以用 模块名.变量
可以使用as 关键字,另外起名,方便调用
(2)from import 导入变量
from import 引入的是 变量(也可以引入模块,不常用)
1.如果只导入某个变量,可以使用from-import来导入变量
此时再引用a,不需要再写t.c7.a,而只需要正常写a即可
同理,写成上图所示也可以
2.如果想要导入某个模块中的许多变量,则可以用*来代替
如何让*只导入需要的文件:
在被引用的模块相应位置加入:__all__ = [需要的变量n,需要的变量m]
3.__init__.py的用法
- 当包被导入(import)的时候,python会首先自动执行__init__.py文件
- 导入包中的模块或模块的变量,也会先运行__init__.py文件
- 具体应用1:在__init___.py中使用__all__['模块1','模块2']来限定导入包时,使用*只能导入模块1和模块2的内容
- 在__init__.py中批量引用系统库,则import包后即可使用这些库
4.常见错误
- 包和模块是不会被重复导入的
- 避免循环导入(在A模块中引入B模块,同时在B模块中引入A模块)(多个模块中形成闭环也一样),否则会死循环
5.模块内置变量
dir()函数可以返回模块中所有变量,包括自己定义的变量与系统内置变量,其中系统内置变量一般会是“__变量__”格式
内置变量:
- __name__ :命名空间
- __package__ :包的名称
- __doc__ :模块的注释(即三引号的注释,不是#的注释)
- __file__ :文件路径
6.入口文件和普通模块内置变量的区别
入口文件的定义:主动运行的那个主文件就叫做入口文件,其它在此文件中引用的称为模块
如果一个.py文件被当做应用文件入口(入口文件),则其内置函数反应如下:
- __name__:__main__(不是模块名)
- __package__:NoneType,即被视作不属于任何包
- __doc__:根据有无注释决定
- __file__:与python的文件存储有关,与执行目录有关
7.__name__的经典应用
if __name__ == '__main__':
pass
判断其是否是入口文件还是一般的模块。
如果作为模块导入,就不会允许if __name__下面的语句,反之则会。
8.相对导入和绝对导入
- 顶级包:一个模块的顶级包由其与入口文件main.py的关系决定(与入口文件同级的包),即为该包下所有模块的顶级包.因此,在入口文件中导入模块时,格式应为:(import 顶级包.次级包.次次级包.模块名)
- 绝对导入:要从顶级包开始导入(import 顶级包.次级包.次次级包.模块名)
- 相对导入:用‘.’表示当前目录(同级目录);‘ ..’表示上级目录;‘...’表示上上级目录,以此类推
- import不支持相对导入,要用from-import
- 入口文件不支持相对导入, 要用绝对导入
- 相对导入, 无法超过顶级包