Python_工程的组织结构

一、Python项目的组织结构:包、模块、类(函数、变量)

包:可以理解为文件夹

模块:.py文件

类:包含函数、变量。函数和变量算作类里的具体组恒部分,类的特性

Python_工程的组织结构_第1张图片
Python_工程的组织结构_第2张图片

二、包与模块

1. 命名空间:包名.模块名 (区分两个包下同名的模块)

2. 包下面还可以有子包,子包可以与模块同级

3. 包可以理解为文件夹,但文件夹不一定是包,若要使文件夹表现为包,必须在这个文件夹下新建一个名为“__init__.py”的文件。里面内容可以为空,不能普通的进行命名空间调用

三、模块导入

(一)import 导入模块语法:

1. import 模块名

注意:(1)使用模块前先导入模块后再使用

            (2)使用导入模块中的变量或函数的格式:模块名.变量或函数

Python_工程的组织结构_第3张图片

2. 如果结构不同层级,要用命名空间解决

其中运行后会自动生成一个.pyc文件,为python的自解码文件

Python_工程的组织结构_第4张图片

3. import 模块名 as 名称

可以解决命名空间过长的问题

eg:import  t.c7  as  m

print ( m.a)

Python_工程的组织结构_第5张图片

(二)from 模块 import a(变量)或 def(函数)

1. 引入

Python_工程的组织结构_第6张图片

2. 可以用 from  t.c7  import  * ,代表引此模块找那个所有的成员(但是引入不明确)

改进:在c7模块中第一行声明“__all__ = [ a, b ]”,指定引入的变量。

其中“__all__ = [ a, b ]”称为模块的内置变量或内置属性

Python_工程的组织结构_第7张图片
在c7中加入 “__all__ = [ a, b ]”
Python_工程的组织结构_第8张图片
因为没有指定引入d,所以报错

附加:

1. 设置 files.exclude 来隐藏相关文件和文件夹

2. 代码换行最好用(),或者在换行末尾加上反斜杠\ (不推荐)

问题!!!

运行程序没有生成 "__pycache__.py" 文件???

也隐藏不了???

Python_工程的组织结构_第9张图片


四、__init__.py的作用

1. 当导入包时,python会自动执行 "__init__.py" 里的代码,可作包和模块的初始化

2. __all__ 

3. 可以作批量导入※

Python_工程的组织结构_第10张图片
Python_工程的组织结构_第11张图片

五、包与模块的几个常见错误

 1. 包和模块不会被重复导入。

2. 避免循环导入

3. 导入模块时,python会执行模块里的所有代码

六、模块内置变量

1. dir()函数:返回模块的所有变量名称

2. __****__:表示内置变量

eg:__name__ 表示命名空间;__package__ 表示包名称;__doc__ 表示模块注释;__file__  表示模块路径

Python_工程的组织结构_第12张图片

异常信息

Traceback:错误堆栈信息,表示程序执行到错误的位置

TypeError:错误信息的描述

七、入口文件和普通模块内置变量的区别

如果一个 .py 文件被当做一个应用程序的入口:

1. 它的名称不再是本身模块的名称,而是被强制更改为 "__main__"

2. 它不属于任何包

3. file内置变量不会像普通模块一样显示绝对路径,它所显示的值也是不确定值,和执行命令所在的目录有关(详情见第二张图)

※ Python的入口文件和普通导入的模块文件是有差异的

Python_工程的组织结构_第13张图片
Python_工程的组织结构_第14张图片

八、__name__

1. dir() 函数查看相关变量

Python_工程的组织结构_第15张图片

2. 让python脚本成为一个普通模块被其他应用程序调用,也可以让自己成为一个可执行文件

3. 有时候一个模块既想被作为一个可执行文件,又想成为一个普通的模块。

当它们处于两种不同的情形下时,有些逻辑处理时不相同的,所以如果想知道此时模块时处于什么情形,可以使用如下代码

if  __name__ == '__main__':    pass,来判断当前模块是否是一个入口文件

Python_工程的组织结构_第16张图片

4. python中的普通模块必须有一个包,当想要把一个可执行文件当做一个普通模块运行时,可以使用 -m 参数

如:python -m 命名空间.模块名(package_name.module_name) (如下图)

注:此时若当做普通模块,必须包括 包名/命名空间???   

python  seven\c15.py???

Python_工程的组织结构_第17张图片

九、相对导入和绝对导入

顶级包与入口文件 main.py 的位置有关,与 main.py 同级的包就是该包下所有模块的顶级包。而对于入口文件来说不存在包的概念。

绝对导入:从顶级包到被导入模块名称的完整路径。import 和 from ... import ...

相对导入:“ .  ..  ... ” 来表示相对路径。一个点表示当前包,两个点表示上一级包...。from ... import ...

Python_工程的组织结构_第18张图片

注意:

1. import 不支持相对导入,只能使用 from ... import ... 格式实现相对导入

2. 入口文件中不能使用相对导入,因为它没有包的概念

3. 使用相对导入不要超出顶级包,入口文件同级的都不能使用相对导入(图1)

4. 实在想用相对路径导入,此时把入口文件当做一个模块来执行,用 python -m demo.main(图2)

Python_工程的组织结构_第19张图片
Python_工程的组织结构_第20张图片

你可能感兴趣的:(Python_工程的组织结构)