从大局着眼从细节着手,在总体上把握住python程序的组织结构、工作机制原理,有利于有条不紊地开展深入学习研究与应用,能始终保持胸有成竹,从容不迫面对错综复杂局面。
一、组织层次结构
(一)从Python在处理功能复用和功能颗粒度划分的角度来分,由大到小:
1、包(Package),对应于一个含有“_init_.py”文件的文件夹(如没有,又当成包来调用,有的关联软件会在文件夹内生成一个__pycache__子文件夹),可以看成一种Python工程Project,包下面可以继续创建子包。
包内包含了模块。
2、模块(Module),包含①类、②函数、③变量、④代码。
3、类(Class),包含函数、变量。
4、函数,实现某种功能。
(二)相关命令语句和变量属性
1、import导入模块
(1)import 模块
(2)import 模块 as 重命名
(3)from module import member(模块、函数、变量)
(4)from package.subpackage import module
(5)import module与from module import * 两种模块导入的区别
区别1:
import module 引用共享变量时,要使用module.变量名。而from module import * 直接使用变量名即可
区别2:
import module方式操作module的变量时,本地不会创建新变量,操作的是目标模块的变量。from module import *方 式 操作module变量时,实质上是在本地创建一个与目标模块相同的变量名,并且默认与目标模块变量指向同一个内存空 间。
2、__all__ = ['num1',]
规定外部能引入的模块、函数、变量
3、当包发生调用时,_init_.py内容会首先自动被执,这样可以在此设置__all__
,当多个模块文件都需要用到一些模块文件时,可以在一个包的__init__.py文件中引入这些需要的模块文件,然后多个模块就可以共用。
4、__name__变量,是Python的内置变量,用于指代当前模块。为了区分主执行文件还是被调用的文件,Python引入了一个变量__name__,当文件是被调用时,__name__的值为模块名,当文件被执行时,__name__为'__main__'(如果文件是作为主程序调用,其值就设为main,如果是作为模块被其他文件导入,它的值就是其文件名)。这个特性,为测试驱动开发提供了支持,可以在每个模块中写上测试代码,这些测试代码仅当模块被Python直接执行时才会运行,代码和测试完美的结合在一起。
5、__path__变量,指定了包的搜索路径。
6、__init__ 方法与__new__方法,用在初始化一个类实例,__init__是在类实例创建之后调用,而 __new__方法正是创建这个类实例的方法。
二、项目结构
一个好的项目结构会让我们在开发中更加得心应手,事半功倍。
对于Web项目,我们通常采用Flask或Django等框架,会有一套适合这种项目的工程目录。
对于爬虫项目,通常有Scrapy等开源框架,也会提供一套适合这种项目的工程目录。
1、一位网友总结的Python通用目录结构
ProjectName
│ readme 项目说明文档
│ requirements.txt 存放依赖的外部Python包列表
│ setup.py 安装、部署、打包的脚本
├─ bin 存放脚本,执行文件等
│ └─ projectname
├─ docs 文档和配置
│ └─ abc.rst
│ └─ conf.py 配置文件
└─ projectname 工程源码(包括源码、测试代码等)
│ main.py 程序入口
│ init.py
└─ tests 测试代码
└─ test_main.py
└─ init.py