21.python的模块(Module)和包(Package)
原文:https://www.cnblogs.com/yuanchenqi/article/5732581.html
模块(Module)和包(Package)
模块(modue)的概念
在计算机程序的开发过程中,随着程序代码越写越多,在一个文件里代码就会越来越长,越来越不容易维护。
为了编写可维护的代码,我们把很多函数分组,分别放到不同的文件里,这样,每个文件包含的代码就相对较少,很多编程语言都采用这种组织代码的方式。在Python中,一个.py文件就称之为一个模块(Module)。
使用模块有什么好处?
最大的好处是大大提高了代码的可维护性。
其次,编写代码不必从零开始。当一个模块编写完毕,就可以被其他地方引用。我们在编写程序的时候,也经常引用其他模块,包括Python内置的模块和来自第三方的模块。
所以,模块一共三种:
python标准库
第三方模块
应用程序自定义模块
另外,使用模块还可以避免函数名和变量名冲突。相同名字的函数和变量完全可以分别存在不同的模块中,因此,我们自己在编写模块时,不必考虑名字会与其他模块冲突。但是也要注意,尽量不要与内置函数名字冲突。
模块导入方法
1.import 语句
import module1[, module2[,... moduleN]
当我们使用import语句的时候,Python解释器是怎样找到对应的文件的呢?答案就是解释器有自己的搜索路径,存在sys.path里。
import sys
print(sys.path)
"E:\Program Files\JetBrains\PycharmProjects\python_demo\venv\Scripts\python.exe" "E:/Program Files/JetBrains/PycharmProjects/python_demo/day21/lesson/test.py"
['E:\\Program Files\\JetBrains\\PycharmProjects\\python_demo\\day21\\lesson', 'E:\\Program Files\\JetBrains\\PycharmProjects\\python_demo', 'E:\\Program Files\\JetBrains\\PyCharm 2019.2.3\\helpers\\pycharm_display', 'C:\\Users\\Administrator\\AppData\\Local\\Programs\\Python\\Python38-32\\python38.zip', 'C:\\Users\\Administrator\\AppData\\Local\\Programs\\Python\\Python38-32\\DLLs', 'C:\\Users\\Administrator\\AppData\\Local\\Programs\\Python\\Python38-32\\lib', 'C:\\Users\\Administrator\\AppData\\Local\\Programs\\Python\\Python38-32', 'E:\\Program Files\\JetBrains\\PycharmProjects\\python_demo\\venv', 'E:\\Program Files\\JetBrains\\PycharmProjects\\python_demo\\venv\\lib\\site-packages', 'E:\\Program Files\\JetBrains\\PycharmProjects\\python_demo\\venv\\lib\\site-packages\\setuptools-40.8.0-py3.8.egg', 'E:\\Program Files\\JetBrains\\PycharmProjects\\python_demo\\venv\\lib\\site-packages\\pip-19.0.3-py3.8.egg', 'E:\\Program Files\\JetBrains\\PyCharm 2019.2.3\\helpers\\pycharm_matplotlib_backend']
Process finished with exit code 0
2.from…import 语句
from modname import name1[, name2[, ... nameN]]
这个声明不会把整个modulename模块导入到当前的命名空间中,只会将它里面的name1或name2单个引入到执行这个声明的模块的全局符号表。
3.from…import* 语句
from modname import *
from modname import *
这提供了一个简单的方法来导入一个模块中的所有项目。然而这种声明不该被过多地使用。大多数情况, Python程序员不使用这种方法,因为引入的其它来源的命名,很可能覆盖了已有的定义。
4.运行本质
#1 import test
#2 from test import add
无论1还是2,首先通过sys.path找到test.py,然后执行test脚本(全部执行),区别是1会将test这个变量名加载到名字空间,而2只会将add这个变量名加载进来。
import的作用:
1.执行对应文件
2.引入变量名
3.过程是把引入文件的所有逻辑执行一边,然后调用所需要的功能函数。(目前理解就是会执行print语句)
例:在cal原有代码前面和后面加上输出语句。
print('aaa')
def jia(x,y):
return x+y
print('aaa')
运行后:
"E:\Program Files\JetBrains\PycharmProjects\python_demo\venv\Scripts\python.exe" "E:/Program Files/JetBrains/PycharmProjects/python_demo/day21/lesson/test.py"
aaa
aaa
3
Process finished with exit code 0
练习例子:

cal.py文件代码:
def jia(x,y):
return x+y
test.py代码:
# 写法1
import cal
# print(cal.jia(1,2))
# 写法2
from cal import jia
# from cal import * #不推荐
# print(jia(3,4))
# 查看路径
import sys
print(sys.path)
包(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啦:
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 --------------
if __name__=='__main__':
print('ok')
“Make a .py both importable and executable”
如果我们是直接执行某个.py文件的时候,该文件中那么”__name__ == '__main__'“是True,但是我们如果从另外一个.py文件通过import导入该文件的时候,这时__name__的值就是我们这个py文件的名字而不是__main__。
这个功能还有一个用处:调试代码的时候,在”if __name__ == '__main__'“中加入一些我们的调试代码,我们可以让外部模块调用的时候不执行我们的调试代码,但是如果我们想排查问题的时候,直接执行该模块文件,调试代码能够正常运行!
3--------------

##-------------cal.py
def add(x,y):
return x+y
##-------------main.py
import cal #from module import cal
def main():
cal.add(1,2)
##--------------bin.py
from module import main
main.main()
**注意: from module import cal 改成 from . import cal同样可以,这是因为bin.py是我们的执行脚本,sys.path里有bin.py的当前环境。即/Users/yuanhao/Desktop/whaterver/project/web这层路径,无论import what , 解释器都会按这个路径找。所以当执行到main.py时,import cal会找不到,因为sys.path里没有/Users/yuanhao/Desktop/whaterver/project/web/module这个路径,而from module/. import cal 时,解释器就可以找到了。from module import cal 改成 from . import cal同样可以,这是因为bin.py是我们的执行脚本,sys.path里有bin.py的当前环境。即/Users/yuanhao/Desktop/whaterver/project/web这层路径,无论import what , 解释器都会按这个路径找。所以当执行到main.py时,import cal会找不到,因为sys.path里没有/Users/yuanhao/Desktop/whaterver/project/web/module这个路径,而from module/. import cal 时,解释器就可以找到了。
练习例子:




21.python的模块(Module)和包(Package)的更多相关文章
- Python中模块(Module)和包(Package)的区别
本文绝大部分内容转载至:廖雪峰官方网站 1. 模块(Module) 在计算机程序的开发过程中,随着程序代码越写越多,在一个文件里代码就会越来越长,越来越不容易维护. 为了编写可维护的代码,我们把很多函 ...
- python的模块(module)和包(package)机制:import和from..import..
在python用import或者from...import来导入相应的模块. 模块其实就一些函数和类的集合文件,它能实现一些相应的功能,当我们需要使用这些功能的时候,直接把相应的模块导入到我们的程序中 ...
- Python(模块(modue)、包(package))
''' 一 模块 模块一共三种: python标准库 第三方模块 应用程序自定义模块 模块两种执行方式: 1 用于启动执行 2 用于被调用执行 key:import module: 将执行文件(mod ...
- 00.模块1.模块(Module)和包(Package)
转自廖雪峰老师官方网站 在计算机程序的开发过程中,随着程序代码越写越多,在一个文件里代码就会越来越长,越来越不容易维护. 为了编写可维护的代码,我们把很多函数分组,分别放到不同的文件里,这样,每个文件 ...
- 模块(modue)和包(package)的概念-import导入模块
模块 在计算机程序的开发过程中,随着程序代码越写越多,在一个文件里代码就会越来越长,越来越不容易维护. 为了编写可维护的代码,我们把很多函数分组,分别放到不同的文件里,这样,每个文件包含的代码就相对较 ...
- python之模块导入和包
一.何为模块 1.一个模块就是一个包含了python定义和声明的文件,文件名就是模块名字加上.py的后缀. 2.模块目的和函数,对象等一样,是为了代码的复用性而存在的.即一个py程序写了很多功能,也可 ...
- python的模块和包
==模块== python语言的组织结构层次: 包->模块->代码文件->类->函数->代码块 什么是模块呢 可以把模块理解为一个代码文件的封装,这是比类更高一级的封装层 ...
- python模块module package
python模块module package module package 常用模块 模块与包的区别 模块分为内置模块.第三方模块,自定义模块 程序会先从内置到第三方再到当前工作目录下去找你导入的 ...
- python 深入模块和包
模块可以包含可执行语句以及函数的定义. 这些语句通常用于初始化模块. 它们只在 第一次 导入时执行.只在第一次导入的时候执行,第一次.妈蛋的第一次...后面再次导入就不执行了. [1](如果文件以脚本 ...
随机推荐
- 2018-12-24-win10-uwp-求两个矩形相连的几何
title author date CreateTime categories win10 uwp 求两个矩形相连的几何 lindexi 2018-12-24 20:51:49 +0800 2018- ...
- android 数据存储----android短信发送器之文件的读写(手机+SD卡)
本文实践知识点有有三: 1.布局文件,android布局有相对布局,线性布局,绝对布局,表格布局,标签布局等.各个布局能够嵌套的.本文的布局文件就是线性布局的嵌套 <LinearLayout x ...
- 如何解决iOS内存错误
由于iOS5.0之前没有自动应用计数机制,也没有Java那样的垃圾回收功能.我们都需要自己管理和控制对象的回收,这是一件很麻烦的事情,也是做iOS项目中最容易出现的问题.如果不掌握这些方法,调试这些问 ...
- 1x1卷积
你可能会想为什么有人会用1x1卷积,因为它关注的不是一块像素,而是一个像素,图1 图1 我们看看传统的卷积,它基本上是运行在一个小块图像上的小分类器,但仅仅是个线性分类器.图2 图2 如果你在中间加一 ...
- 是readdir,还是readdir_r
readdir的原型如下: struct dirent *readdir(DIR *dirp); 因为内部使用了静态数据,所以readdir被认为不是线程安全的函数,POSIX[i]标准这样描述: T ...
- Ext.FormPanel-----FieldSet的用法
Ext.form.FieldSet的常用配置项: 1.checkboxToggle : Mixed True表示在lengend标签之前fieldset的范围内渲染一个checkbox,或者送入一个D ...
- PHP中 spl_autoload_register() 函数用法
这篇文章主要介绍了PHP中spl_autoload_register()函数用法,结合实例形式分析了__autoload函数及spl_autoload_register函数的相关使用技巧,需要的朋友可 ...
- artTemplate模版引擎的使用
artTemplate: template.js 一款 JavaScript 模板引擎,简单,好用.提供一套模板语法,用户可以写一个模板区块,每次根据传入的数据,生成对应数据产生的HTML片段,渲染不 ...
- HTML静态网页---样式属性
一.背景与前景 1.背景: 2.前景字体: 二.边界和边框 border(表格边框.样式等).margin(表外间距).padding(内容与单元格间距). 三.列表与方块 width.height. ...
- HTML5 meta 属性整理
<!DOCTYPE html> <!-- 使用 HTML5 doctype,不区分大小写 --> <html lang="zh-cmn-Hans"&g ...