一、Python项目的组织结构:包、模块、类(函数、变量)
包:可以理解为文件夹
模块:.py文件
类:包含函数、变量。函数和变量算作类里的具体组恒部分,类的特性
二、包与模块
1. 命名空间:包名.模块名 (区分两个包下同名的模块)
2. 包下面还可以有子包,子包可以与模块同级
3. 包可以理解为文件夹,但文件夹不一定是包,若要使文件夹表现为包,必须在这个文件夹下新建一个名为“__init__.py”的文件。里面内容可以为空,不能普通的进行命名空间调用
三、模块导入
(一)import 导入模块语法:
1. import 模块名
注意:(1)使用模块前先导入模块后再使用
(2)使用导入模块中的变量或函数的格式:模块名.变量或函数
2. 如果结构不同层级,要用命名空间解决
其中运行后会自动生成一个.pyc文件,为python的自解码文件
3. import 模块名 as 名称
可以解决命名空间过长的问题
eg:import t.c7 as m
print ( m.a)
(二)from 模块 import a(变量)或 def(函数)
1. 引入
2. 可以用 from t.c7 import * ,代表引此模块找那个所有的成员(但是引入不明确)
改进:在c7模块中第一行声明“__all__ = [ a, b ]”,指定引入的变量。
其中“__all__ = [ a, b ]”称为模块的内置变量或内置属性
附加:
1. 设置 files.exclude 来隐藏相关文件和文件夹
2. 代码换行最好用(),或者在换行末尾加上反斜杠\ (不推荐)
问题!!!
运行程序没有生成 "__pycache__.py" 文件???
也隐藏不了???
四、__init__.py的作用
1. 当导入包时,python会自动执行 "__init__.py" 里的代码,可作包和模块的初始化
2. __all__
3. 可以作批量导入※
五、包与模块的几个常见错误
1. 包和模块不会被重复导入。
2. 避免循环导入
3. 导入模块时,python会执行模块里的所有代码
六、模块内置变量
1. dir()函数:返回模块的所有变量名称
2. __****__:表示内置变量
eg:__name__ 表示命名空间;__package__ 表示包名称;__doc__ 表示模块注释;__file__ 表示模块路径
异常信息
Traceback:错误堆栈信息,表示程序执行到错误的位置
TypeError:错误信息的描述
七、入口文件和普通模块内置变量的区别
如果一个 .py 文件被当做一个应用程序的入口:
1. 它的名称不再是本身模块的名称,而是被强制更改为 "__main__"
2. 它不属于任何包
3. file内置变量不会像普通模块一样显示绝对路径,它所显示的值也是不确定值,和执行命令所在的目录有关(详情见第二张图)
※ Python的入口文件和普通导入的模块文件是有差异的
八、__name__
1. dir() 函数查看相关变量
2. 让python脚本成为一个普通模块被其他应用程序调用,也可以让自己成为一个可执行文件
3. 有时候一个模块既想被作为一个可执行文件,又想成为一个普通的模块。
当它们处于两种不同的情形下时,有些逻辑处理时不相同的,所以如果想知道此时模块时处于什么情形,可以使用如下代码
if __name__ == '__main__': pass,来判断当前模块是否是一个入口文件
4. python中的普通模块必须有一个包,当想要把一个可执行文件当做一个普通模块运行时,可以使用 -m 参数
如:python -m 命名空间.模块名(package_name.module_name) (如下图)
注:此时若当做普通模块,必须包括 包名/命名空间???
python seven\c15.py???
九、相对导入和绝对导入
顶级包与入口文件 main.py 的位置有关,与 main.py 同级的包就是该包下所有模块的顶级包。而对于入口文件来说不存在包的概念。
绝对导入:从顶级包到被导入模块名称的完整路径。import 和 from ... import ...
相对导入:“ . .. ... ” 来表示相对路径。一个点表示当前包,两个点表示上一级包...。from ... import ...
注意:
1. import 不支持相对导入,只能使用 from ... import ... 格式实现相对导入
2. 入口文件中不能使用相对导入,因为它没有包的概念
3. 使用相对导入不要超出顶级包,入口文件同级的都不能使用相对导入(图1)
4. 实在想用相对路径导入,此时把入口文件当做一个模块来执行,用 python -m demo.main(图2)