python项目开发中首先要学习的几个知识点
1.知识点:
2.解释:
-
python中的推荐命名规范。
参考Google开源风格
python代码中需要命名的主要包括包、模块、类、函数、变量、常量,python之父Guido
推荐的 命名方法如下:*
类型 |
说明 |
示例 |
包 |
小写下划线 |
my_package |
模块 |
小写下划线 |
my_module |
类 |
大驼峰命名法 |
MyClass |
函数 |
小写下划线 |
my_function |
变量 |
小写下划线 |
my_variable |
常量 |
大写下划线 |
MY_CONSTANT |
-
python项目的推荐目录结构。
以项目名称为‘MyProject为例,说明推荐的目录结构,如下:’
MyProject/ 项目名称
|-- bin/ 目录下放项目的可执行文件
| |-- myproject
|
|-- my_project/ 所有的项目代码、模块目录都放在这个目录下
| |-- tests/ 单元测试代码目录
| | |-- __init__.py
| | |-- test_main.py
| |
| |-- __init__.py
| |-- main.py 程序入口
|
|-- docs/ 项目文档目录
| |-- conf.py
| |-- abc.txt
|
|-- setup.py 安装、部署、打包的脚本
|-- requirements.txt 依赖的外部python包的列表
|-- README 项目说明文件
-
python中__init__.py
的作用。
__init__.py
主要有两个作用:
- 让代码文件夹变成可以被导入
import
的软件包,如果文件夹下没有__init__.py
文件则使用import 或from import
会报错 ImportError: No module named...
- 使用
from pakge import *
时 *****所指的模块可以在__init__.py
中自定义
下面以2中推荐目录说明__init__.py
的作用,python3.3及以上版本不使用__init__.py
也不会报错,但在这里我们还是推荐使用__init__.py
-
以2中目录为例,如果my_project
文件夹和tests
文件夹中没有__init__.py
,那么在想要在docs
文件夹下的conf.py
文件中使用其他模块将会报错,如下:
conf.py 中代码 |
运行结果 |
import my_project.main |
ImportError: No module named my_project.main
|
import my_project.tests.test_main |
ImportError: No module named my_project.tests.test_main
|
-
以2中目录为例,如果只有my_project
中有__init__.py
,那么在想要在docs
文件夹下的conf.py
文件中使用其他模块如下:
conf.py 中代码 |
运行结果 |
import my_project.main |
成功 |
import my_project.tests.test_main |
ImportError: No module named my_project.tests.test_main
|
-
以2中目录为例,如果my_project
文件夹和tests
文件夹中都有__init__.py
,那么在想要在docs
文件夹下的conf.py
文件中使用其他模块如下:
conf.py 中代码 |
运行结果 |
import my_project.main |
成功 |
import my_project.tests.test_main |
成功 |
-
python中在不同文件夹/同一个文件夹两种情况下如何引用另一个.py文件。
-
不同文件夹
在python3.3及以上的版本中,不同文件夹引用.py文件的方法如下:
# 以2中目录为例,my_project目录中的main.py 要引用 tests 目录下的test_main.py
import tests.test_main
# 或者
from tests import test_main
在python3.3以下的版本,在要引用.py的文件夹下添加__init__.py
文件后,可使用如上同样的方法导入.py模块。
-
同一文件夹直接使用import 模块名
(.py文件名)导入
-
python为什么要使用if __name__ == '__main__':
。
先给结论:
1.防止当前.py文件在被其他.py文件导入时显示多余的程序主体部分
2.程序的入口
举例如下:
有aa_one.py
文件,其中定义了一个print_a()
方法,同时还打印了一行字符串
现在有aa_two.py
想要调用aa_one.py
中的方法print_a()
方法,如下:
我们从如上执行结果可以看到,我们只想要调用执行aa_one.py
中的方法print_a()
方法,但在调用print_a()
方法之前就先执行print('what ever')
,原因是在我们使用import aa_one
语句导入时会把aa_one.py中的代码执行一遍,如何规避这个问题呢,有的同学可能会想到把print('what ever')
删除掉不就好了吗,这其实是一种解决方案,但是更多时候我们在写一些功能类或者方法的时候,我们就是需要在文件中编写一些测试的代码,但是在写完之后我们又不想删除,因为可能有时候还需要调整测试,为了满足这个需求,我们就可以使用if __name__ == '__main__':
,我们再来看下使用了if __name__ == '__main__':
的情况:
这个时候print('what ever')
就不会在调用中被执行,功能类和方法的调试代码就可以写到if __name__ == '__main__':
中,在被其他模块调用时也不用删除这些测试代码,同时if __name__ == '__main__':
也作为**程序的入口
**。