python(十七)
模块与包的调用
模块(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
的模块。
现在,假设我们的abc
和xyz
这两个模块名字与其他模块冲突了,于是我们可以通过包来组织模块,避免冲突。方法是选择一个顶层包名:
引入了包以后,只要顶层的包名不与别人冲突,那所有模块都不会与别人冲突。现在,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(十七)相关推荐
- Python 十七章 Web开发
Web开发 web应用开发可以说是目前软件开发中最重要的部分.Web开发也经历了几个阶段: 1.静态web界面: 2.CGI: 3.ASP/JSP/PHP: 4.MVC: 目前web开发仍在快速发展中 ...
- python十七:高阶函数
高阶函数:1.函数接受的参数是一个函数名 2.返回值中包含函数 def high(n):n()print("from high")def common():prin ...
- ApacheCN Linux 译文集 20211129 更新
笨办法学 Linux 中文版 练习 0:起步 练习 1:文本编辑器,vim 练习 2:文本浏览器,少即是多 练习 3:Bash:Shell..profile..bashrc..bash_history ...
- 第十七部分-Python文档和测试
第十七部分-Python文档和测试 转载于:https://www.cnblogs.com/daxionglaiba/p/11156995.html
- 九十七、轻松搞定Python中的PDF办公自动化系列
@Author:Runsen @Date:2020/7/15 人生最重要的不是所站的位置,而是内心所朝的方向.只要我在每篇博文中写得自己体会,修炼身心:在每天的不断重复学习中,耐住寂寞,练就真功,不畏 ...
- 八十七、Python | 十大排序算法系列(上篇)
@Author:Runsen @Date:2020/7/10 人生最重要的不是所站的位置,而是内心所朝的方向.只要我在每篇博文中写得自己体会,修炼身心:在每天的不断重复学习中,耐住寂寞,练就真功,不畏 ...
- [Python从零到壹] 三十七.图像处理基础篇之图像融合处理和ROI区域绘制
欢迎大家来到"Python从零到壹",在这里我将分享约200篇Python系列文章,带大家一起去学习和玩耍,看看Python这个有趣的世界.所有文章都将结合案例.代码和作者的经验讲 ...
- 第十七章 扩展Python
第十七章 Python什么都能做,真的是这样.这门语言功能强大,但有时候速度有点慢. 鱼和熊掌兼得 本章讨论确实需要进一步提升速度的情形.在这种情况下,最佳的解决方案可能不是完全转向C语言(或其他中低 ...
- python 保存文件 吃内存_孤荷凌寒自学python第三十七天python的文件与内存变量之间的序列化与反序列化...
孤荷凌寒自学python第三十七天python的文件与内存变量之间的序列化与反序列化 (完整学习过程屏幕记录视频地址在文末,手写笔记在文末) 一.什么是序列化与反序列化 序列化是指将内存中的数据进行指 ...
- python数据挖掘课程】十七.社交网络Networkx库分析人物关系(初识篇)
#2018-03-30 09:21:39 March Friday the 13 week, the 089 day SZ SSMR python数据挖掘课程]十七.社交网络Networkx库分析人物 ...
最新文章
- ARIMA+参数选择p+d+q
- js 获取sessionid_百战卓越班学员学习经验分享:页面js代码
- docker compose 在单机环境下一键打包运行
- Android开源之BaseRecyclerViewAdapterHelper(持续更新!)
- 标准库函数、系统调用的区别
- android 闹钟服务,如果闹钟时间已经过去,android可以防止即时触发闹钟服务
- MSSQL优化之————探索MSSQL执行计划
- 如何输入一个整数逆序输出_如何理解运算放大器的共模输入和输出摆幅限制?...
- Mind_Manager_2
- 10个 NPM 使用技巧
- atititt.java定时任务框架选型Spring Quartz 注解总结
- tcpip详解卷一第3章(1)
- 计算机系统概述-为什么要学习计算机系统基础
- php奖学金系统,java/php/net/pythont奖助学金管理系统设计
- Android 开发日志之LBS相关开发
- 新xp系统无法连接网络连接服务器,WinXP系统本地连接受限制或无连接怎么办?...
- matlab output()函数,matlab 函数y=f(input,output)该如何实现?
- RT-Thread学习笔记【网络设备与BSD套接字组件】
- 阿里云 ADAM 迁移工具测试问题记录
- Gazebo仿真场景搭建+配置