一、模块

在计算机程序的开发过程中,随着程序代码越写越多,在一个文件里代码就会越来越长,越来越不容易维护。

为了编写可维护的代码,我们把很多函数分组,分别放到不同的文件里,这样,每个文件包含的代码就相对较少,很多编程语言都采用这种组织代码的方式。在Python中,一个.py文件就称之为一个模块(Module)

模块导入的方法

1.import

import module1[, module2[,... moduleN]

这种方法在使用模块中的函数的时候需要在前面加上它所属的模块,像这样

import fun
fun.tools()

否则无法正确调用模块中的函数。

2.from…import

from modname import name1[, name2[, ... nameN]]

这种方法不会将整个模块中的内容导入到当前的命名空间中,只会将它里面的name1或name2单个引入到执行这个声明的模块的全局符号表。

3 .From…import*

导入一个模块中的所有项目。然而这种声明不该被过多地使用。大多数情况, Python程序员不使用

这种方法,因为引入的其它来源的命名,很可能覆盖了已有的定义。

这些方法的运行本质则是先通过sys.path找到模块,然后执行模块的脚本(全部执行,即将模块中的所有语句执行一遍),区别是方法1会将模块的变量名加载到名字空间,而2只会将name1这个变量名加载进来。

二、包

如果不同的人编写的模块名相同怎么办?为了避免模块名冲突,Python又引入了按目录来组织模块的方法,称为包(Package)。

举个例子,一个abc.py的文件就是一个名字叫abc的模块,一个xyz.py的文件就是一个名字叫xyz的模块。

现在,假设我们的abcxyz这两个模块名字与其他模块冲突了,于是我们可以通过包来组织模块,避免冲突。方法是选择一个顶层包名:

引入了包以后,只要顶层的包名不与别人冲突,那所有模块都不会与别人冲突。现在,view.py模块的名字就变成了hello_django.app01.views,类似的,manage.py的模块名则是hello_django.manage。

请注意,每一个包目录下面都会有一个__init__.py的文件,这个文件是必须存在的,否则,Python就把这个目录当成普通目录(文件夹),而不是一个包。__init__.py可以是空文件,也可以有Python代码,因为__init__.py本身就是一个模块,而它的模块名就是对应包的名字。

调用包就是执行包下的__init__.py文件

注意:

1 from tools import show
2 show()

这样使用的时候,在PyCharm上运行不会出错原因是PyCharm将mod这一层的路径加入到了sys.path中,但是如果程序不在PyCharm中运行的时候则会报错。

解决方法:手动将路径加到sys.path中

from tools import show
import sys,os
BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
#找到mod这一层的路径
sys.path.append(BASE_DIR)
show()

1.__name__

如果我们是直接执行某个.py文件的时候,该文件中那么”__name__ == '__main__'“是True,但是我们如果从另外一个.py文件通过import导入该文件的时候,这时__name__的值就是我们这个py文件的名字而不是__main__。

这个功能还有一个用处:调试代码的时候,在”if __name__ == '__main__'“中加入一些我们的调试代码,我们可以让外部模块调用的时候不执行我们的调试代码,但是如果我们想排查问题的时候,直接执行该模块文件,调试代码能够正常运行!

最新文章

  1. 自动备份SQL数据库 并删除指定日期之前的备份文件
  2. 说说设计模式~装饰器模式(Decorator)
  3. Java并发之ScheduledExecutorService(schedule、scheduleAtFixedRate、scheduleWithFixedDelay)
  4. bccomp比较大小注意
  5. 连接到CentOS(Linux)服务器ssh、mysql缓慢
  6. Webform(分页、组合查询)
  7. 全选Form > Grid 的所有行
  8. <Stackoverflow> 如何提问
  9. QML嵌入到QWidget中方法
  10. python中的迭代
  11. Android build-tools升级到23.0.0_rc1无法解决编译后的问题
  12. Struts2文件的上传
  13. PHP中的for循环
  14. springboot 注册服务注册中心(zk)的两种方式
  15. Ocelot中文文档-Raft(实验功能不能用于生产环境)
  16. BEX5下实现鼠标滚动滚动条
  17. 微信小程序自运营器 微信小程序自动运营器(让你的微信小程序,公众号零运营成本,24小时全自动运营)
  18. Ubuntu16.04 安装 MySQL
  19. 安装babel
  20. canal 入门(基于docker)

热门文章

  1. arcgis api for javascript本地部署加载地图
  2. CVE-2017-8046 复现与分析
  3. vux UI 项目国际化
  4. SQLite加密方式 [转]
  5. 【VSC】我安装了哪些扩展插件
  6. boost::bind 学习
  7. SpringMVC的应用与工作流程解析
  8. 火狐下不能使用非行间样式currentStyle用getComputedStyle获取
  9. #leetcode刷题之路39-组合总和
  10. Repository与Factory关系