模块与包的调用

模块(modue)的概念

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

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

使用模块有什么好处?

最大的好处是大大提高了代码的可维护性。

其次,编写代码不必从零开始。当一个模块编写完毕,就可以被其他地方引用。我们在编写程序的时候,也经常引用其他模块,包括Python内置的模块和来自第三方的模块。

所以,模块一共三种:

  • python标准库
  • 第三方模块
  • 应用程序自定义模块

另外,使用模块还可以避免函数名和变量名冲突。相同名字的函数和变量完全可以分别存在不同的模块中,因此,我们自己在编写模块时,不必考虑名字会与其他模块冲突。但是也要注意,尽量不要与内置函数名字冲突。

模块导入方法

1 import 语句

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

当我们使用import语句的时候,Python解释器是怎样找到对应的文件的呢?答案就是解释器有自己的搜索路径,存在sys.path里。

因此若像我一样在当前目录下存在与要引入模块同名的文件,就会把要引入的模块屏蔽掉。

当import foo时,首先会立刻创建一个新的名称空间,用来存放所有foo.py中定义的名字;然后会在该名称空间内执行foo.py内所
有的代码,最后需要知道的是import关键字
就是定义了一个名字,只不过此刻我们用import定义的是一个模块名字foo,该名字就是指
向foo.py的名称空间,而foo.的方式就是从该名称空间里找名字,可以使用foo.__dict__来查看这些名字。

在新建的名称空间里执行源文件(foo.py)代码时,所有对全局名称空间的引用或修改,都是以foo.py为准,而不是当前文件(test.py)的全局名称空间

注意1:

个模块可以在当前位置import多次,但只有第一次导入会执行源文件内的代码,原因是:第一次导入就会将模块包含的内
容统统加载到内存了,以后在当前文件位置的导入都是指向内存中已有的模块

注意2:

1
2
3
import logging as log
log.critical("www")

2 from…import 语句

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

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

其中, from…import* 语句提供了一个简单的方法来导入一个模块中的所有项目。然而这种声明不该被过多地使用。大多数情况, Python程序员不使用这种方法,因为引入的其它来源的命名,很可能覆盖了已有的定义。  

  

包(package)

如果不同的人编写的模块名相同怎么办?为了避免模块名冲突,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文件

注意点(important)

1--------------

在nod1里import  hello是找不到的,有同学说可以找到呀,那是因为你的pycharm为你把myapp这一层路径加入到了sys.path里面,所以可以找到,然而程序一旦在命令行运行,则报错。有同学问那怎么办?简单啊,自己把这个路径加进去不就OK啦:

1
2
3
4
5
import sys,os
BASE_DIR=os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
sys.path.append(BASE_DIR)
import hello
hello.hello1()

2 --------------

1
2
if __name__=='__main__':
    print('ok')

“Make a .py both importable and executable”

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

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

3   

##-------------cal.py
def add(x,y):return x+y
##-------------main.py
import cal      #from module import caldef main():cal.add(1,2)##--------------bin.py
from module import mainmain.main()

转载于:https://www.cnblogs.com/guozhenle/p/7089240.html

python(十七)相关推荐

  1. Python 十七章 Web开发

    Web开发 web应用开发可以说是目前软件开发中最重要的部分.Web开发也经历了几个阶段: 1.静态web界面: 2.CGI: 3.ASP/JSP/PHP: 4.MVC: 目前web开发仍在快速发展中 ...

  2. python十七:高阶函数

    高阶函数:1.函数接受的参数是一个函数名         2.返回值中包含函数 def high(n):n()print("from high")def common():prin ...

  3. ApacheCN Linux 译文集 20211129 更新

    笨办法学 Linux 中文版 练习 0:起步 练习 1:文本编辑器,vim 练习 2:文本浏览器,少即是多 练习 3:Bash:Shell..profile..bashrc..bash_history ...

  4. 第十七部分-Python文档和测试

    第十七部分-Python文档和测试 转载于:https://www.cnblogs.com/daxionglaiba/p/11156995.html

  5. 九十七、轻松搞定Python中的PDF办公自动化系列

    @Author:Runsen @Date:2020/7/15 人生最重要的不是所站的位置,而是内心所朝的方向.只要我在每篇博文中写得自己体会,修炼身心:在每天的不断重复学习中,耐住寂寞,练就真功,不畏 ...

  6. 八十七、Python | 十大排序算法系列(上篇)

    @Author:Runsen @Date:2020/7/10 人生最重要的不是所站的位置,而是内心所朝的方向.只要我在每篇博文中写得自己体会,修炼身心:在每天的不断重复学习中,耐住寂寞,练就真功,不畏 ...

  7. [Python从零到壹] 三十七.图像处理基础篇之图像融合处理和ROI区域绘制

    欢迎大家来到"Python从零到壹",在这里我将分享约200篇Python系列文章,带大家一起去学习和玩耍,看看Python这个有趣的世界.所有文章都将结合案例.代码和作者的经验讲 ...

  8. 第十七章 扩展Python

    第十七章 Python什么都能做,真的是这样.这门语言功能强大,但有时候速度有点慢. 鱼和熊掌兼得 本章讨论确实需要进一步提升速度的情形.在这种情况下,最佳的解决方案可能不是完全转向C语言(或其他中低 ...

  9. python 保存文件 吃内存_孤荷凌寒自学python第三十七天python的文件与内存变量之间的序列化与反序列化...

    孤荷凌寒自学python第三十七天python的文件与内存变量之间的序列化与反序列化 (完整学习过程屏幕记录视频地址在文末,手写笔记在文末) 一.什么是序列化与反序列化 序列化是指将内存中的数据进行指 ...

  10. python数据挖掘课程】十七.社交网络Networkx库分析人物关系(初识篇)

    #2018-03-30 09:21:39 March Friday the 13 week, the 089 day SZ SSMR python数据挖掘课程]十七.社交网络Networkx库分析人物 ...

最新文章

  1. ARIMA+参数选择p+d+q
  2. js 获取sessionid_百战卓越班学员学习经验分享:页面js代码
  3. docker compose 在单机环境下一键打包运行
  4. Android开源之BaseRecyclerViewAdapterHelper(持续更新!)
  5. 标准库函数、系统调用的区别
  6. android 闹钟服务,如果闹钟时间已经过去,android可以防止即时触发闹钟服务
  7. MSSQL优化之————探索MSSQL执行计划
  8. 如何输入一个整数逆序输出_如何理解运算放大器的共模输入和输出摆幅限制?...
  9. Mind_Manager_2
  10. 10个 NPM 使用技巧
  11. atititt.java定时任务框架选型Spring Quartz 注解总结
  12. tcpip详解卷一第3章(1)
  13. 计算机系统概述-为什么要学习计算机系统基础
  14. php奖学金系统,java/php/net/pythont奖助学金管理系统设计
  15. Android 开发日志之LBS相关开发
  16. 新xp系统无法连接网络连接服务器,WinXP系统本地连接受限制或无连接怎么办?...
  17. matlab output()函数,matlab 函数y=f(input,output)该如何实现?
  18. RT-Thread学习笔记【网络设备与BSD套接字组件】
  19. 阿里云 ADAM 迁移工具测试问题记录
  20. Gazebo仿真场景搭建+配置

热门文章

  1. 进程、线程与应用程序域
  2. (三)Sass和Compass--制作精灵图片
  3. 常用的shell脚本案例(14.04.15更新)
  4. Fedora 18 正式发布
  5. Linux下启 停 oracle 以及em控制台
  6. Windows Live Writer 测试日志
  7. 机动车号牌图像自动识别技术规范
  8. 雷林鹏分享:Redis 管道技术
  9. 高性能mysql的事物隔离级别
  10. Mysql 的使用方式,挺全的够用了