Python6_模块、包、import、from import的解释
先说一下模块和包是什么?
模块(module):简单来说一个模块(module)就是一个py文件。在python中是这么约定。
模块里面有函数、类,就是一组代码的集合。
模块显然要有一个名字,这个名字就是模块名,模块有个内置属性:__name__,这个__name__的值就是模块名。
这里要注意__name__的值不一定一直是模块文件名(不带路径和文件扩展名),当像标准的程序那样直接运行模块时,__name__的值将是缺省"__main__"。
包(package):就是一个目录(文件夹),不过要注意的是并不完全等于目录,是一个带__init__.py的目录(文件夹)。因为解释器看到目录(文件夹)中有__init__.py,就认为这是个包,不然的话认为这是普通的目录(文件夹)。
包是由很多模块组成,也就是一个包里面可以有很多.py的文件。__init__.py文件可以是空文件,也可以有代码。__init__.py文件本身就是个模块,它的模块名等于包名(目录名)。
=====================================================
为什么要有包、模块的概念?
存在即是合理,包和模块的概念的提出肯定是为了解决一些现实问题或具备某些好处。
这些概念的好处就是更好地组织代码,是一种很好的组织代码的方式。
当代码量很大的时候,通过这种包、模块的组织方式,使得每个文件的代码相对较少。也就更加方便维护代码。
还有一个好处就是更加方便地重用代码,只需要导入别人编写好的模块和包,就能够调用别人提供的接口来实现功能。
使用模块和包在重用代码的同时也会产生函数名和变量名的冲突的问题,甚至是模块名冲突。
幸运的是包和模块可以很好起到避免冲突的作用。有点类似于C++中的命名空间的概念。
举个例子:
有两个包叫package1,package2
package1
__init__.py
abc.py
xyz.py
package2
__init__.py
abc.py
那么可以发现两个包里面都有名叫abc的模块,但是它们属于不同的包,名字也就不会冲突,也就是说实际上这两个abc.py的名字分别是:
package1.abc 和 package2.abc。
引入包之后,只要顶层的包名不与别人冲突,那所有的模块都不会与别人冲突。
同样的,使用模块中的某个函数时,需要带上模块名的前缀,例如abc 和xyz两个模块都有名叫func1的函数,如下:
abc.func1
xyz.func1
但是由于属于不同的模块,调用的时候也都带上模块名前缀,所以不会让python解释器不知道调用的是哪个func1。
=====================================================
import xxx 和 from xxx import xxx
这两条语法通过导入模块方便地实现了代码的重用
先说使用方法:
import 模块名
import 模块名1, 模块名2
from 模块名 import 函数/类
这两者有什么区别呢?
举个例子
import sys #导入sys这个模块
sys.path #代码中使用sys模块的path方法必须加上sys前缀
from sys import path
path #这里就不需要添加sys前缀,因为解释器已经知道是sys模块了
两种方法的区别总结:
这两种方法是有所区别的,也就是说用from sys import xxx之后,调用sys模块中的函数不需要再加sys前缀了。使用起来是很方便,至少代码量少一些。
但是还是推荐使用import,因为使用import更加易读,知道函数时属于哪个模块,而且也不会造成函数同名的冲突。
假如代码中有刚定义了一个函数也叫path,解释器就不知道是当前刚定义的path还是sys的path。
import还有一个问题就是路径搜索:
解释器需要知道import的包在哪里?
通常情况下解释器会在当前工作目录中查找模块,然后在系统默认的路径下查找模块(sys.path就是啦)
如果你的模块不在当前工作目录下,必须添加到系统路径中,即调用sys.path.append('路径')就可以让解释器找到包在哪里。
否则找不到模块的话,程序会报错。注意这种路径添加方法是临时的,程序关闭之后就无效了;
sys.path是python搜索模块的路径集,是一个list,可以在python环境下使用sys.path.append(path)来添加相关路径,但是在退出python之后,该添加的路径就会自动消失。
====================================================
如何导入自己编写的模块?
通过学习上面的知识,其实已经知道了答案:
方法一:直接用import,但是大前提是你的py执行文件和模块同属于一个目录(父目录)
方法二:如果执行文件和模块不在一个目录下,这时候直接import是找不到自定义模块的。这就需要使用sys.path.append('路径')的方式,告诉解释器出来默认的目录外,还可以从这个路径下找该自定义模块。
方法三:通过pth文件找到自定义模块
利用系统变量,python会扫描path变量的路径来导入模块,可以在系统path里面添加自定义模块的路径。
创建一个module_pwcong.pth文件,文件的内容就是pwcong模块所在的目录,然后将module_pwcong.pth文件放到: \Python\Lib\site-packages,然后就可以直接使用import导入自定义模块了。
===================================================
关于模块和包的再一次讨论:
模块的好处是大大提高了代码的可维护性。
其次,代码编写不必从零开始,当一个模块编写完毕,就可以被其他地方引用。
编写程序的时候经常引用其他模块,包括Python内置模块和来自第三方的模块。
另外,还有一个好处就是,在编写的时候,不必考虑名字会与其他模块冲突。当然要注意不与内置函数名字冲突。
模块:用来从逻辑上组织python代码(变量、类、函数),本质上就是.py文件
文件是物理上组织方式:module_name.py
模块是逻辑上组织方式:module_name
包:定义了一个有模块和子包组成的python应用程序执行环境,本质上就是一个层次的文件目录结构
内建模块:不需要使用import导入,模块文件安装在 Python\Python35\Lib目录下
第三方模块:通过 pip install命令安装的模块,一般安装在 Python\Python35\Lib\site-packages目录下
====================================================
包结构中 __main__.py 的作用:
package
├── __init__.py
└── __main__.py
__init__.py的内容:
import sys
print("__init__")
print(sys.path)
__main__.py的内容:
import sys
print("__main__")
print(sys.path)
python -m package运行:
__init__
['', ...]
__main__
['', ...]
python package运行:
__main__
['package', ...]
加上-m参数时,Python会把当前工作目录添加到sys.path中;
而不加-m时,Python则会把脚本所在目录添加到sys.path中;
加上-m参数时,Python会先将模块或者包导入,然后再执行;
__main__.py文件是一个包或者目录的入口程序。不管加不加-m运行,__main__.py都会被执行;
===================================================
导入包:
补充:直接导入一个包,则不会导入任何包中的模块,但是会执行包中的__init__.py文件的内容,这里的解决方法是1.再在__init__.py文件中对需要的模块进行导入(使用绝对路径);2.使用from 包 import 模块的形式进行导入;
from A import B:使用此方式导入模块时,B一定只能写一个模块名,不能带有“.”语法,而A可以是一个包,也可以是包中的子包,可以使用“.”语法,如from 包.子包 import 模块。这里需要注意的是python中的一种面向关系,即包中只能看到模块,不能看到模块中的资源,而模块只能看见其中的资源,不能看见别的东西
from A import *(重点):这种导入方式如果是将模块中的所用资源导入过来使用,那么这里的A只能是模块;如果A是包,则是将该包中所有的模块都导入进来。需要注意的是,这里有两种特殊情况,1.在A模块中使用__all__=["a","b()"]属性时,则使用from A import *进行导入后就只能使用列表中写的属性和方法,如果没有写__all__=["a","b()"]属性,则默认可以使用A中所有的资源;2.如果A中存在受保护的或者私有的资源,则必须使用__all__=["_a","__b()"]属性进行说明,否则直接使用from A import *进行导入后,仍然无法使用这些资源。
————————————————
该段链接:https://blog.csdn.net/zx870121209/article/details/81515649
Python6_模块、包、import、from import的解释的更多相关文章
- Python 模块详解及import本质
同在当前目录下的模块和包导入 模块定义 本质就是.py结尾的python文件. 用来从逻辑上组织python代码(变量,函数,类,逻辑) 文件名: test.py; 对应的模块名 : test 模块 ...
- import模块/包--软件开发规范
一. 模块 模块:就是一个包含了python定义和声明的文件,文件名就是模块名字加上.py的后缀. import加载的模块分为四个通用类别: 1 使用python编写的代码(.py文件) 2 已被编译 ...
- 小白的Python之路 day5 python模块详解及import本质
一.定义 模块:用来从逻辑上组织python代码(变量,函数,类,逻辑:实现一个功能) 本质就是.py结尾的python文件(文件名:test.py,对应的模块名:test) 包:用来从逻辑上组织模块 ...
- 模块详解及import本质
一.模块的定义 用来从逻辑上组织python代码(变量,函数,类,逻辑:实现一个功能) 本质就是.py结尾的Python文件(文件名test.py,对应的模块名:test) 包:用来从逻辑上组织模块的 ...
- python基础之 025 模块加载与import的使用
内容梗概: 1. 模块 2. import 3. from xxx import xxx 1.模块定义:模块就是一个包含了python定义和声明的文件,文件名就是模块的名字加上.py后缀.目前写的所有 ...
- 2019-7-16 import / from...import... 模块的调用
模块调用的总结:如果你是pycharm打开文件,会自动帮你把文件根目录加到system.path中,你要调用模块直接以根目录为基准开始找.1.假如你要调用和文件根目录为同级的文件,你直接import ...
- [Eclipse] - 解决导入flask模块出现的Unresolved Import flask问题
http://www.cnblogs.com/mizhon/p/4242073.html [Eclipse] - 解决导入flask模块出现的Unresolved Import flask问题 最近想 ...
- 模块的语法 import ,from...import....
------------------------积极的人在每一次忧患中都看到一个机会, 而消极的人则在每个机会都看到某种忧患 1. 认识模块 模块可以认为是一个py文件. 模块实际上是我们的py文件运 ...
- python接口自动化测试二十七:密码MD5加密 ''' MD5加密 ''' # 由于MD5模块在python3中被移除 # 在python3中使用hashlib模块进行md5操作 import hashlib # 待加密信息 str = 'asdas89799,.//plrmf' # 创建md5对象 hl = hashlib.md5() # Tips # 此处必须声明encode # 若写法为
python接口自动化测试二十七:密码MD5加密 ''' MD5加密 '''# 由于MD5模块在python3中被移除# 在python3中使用hashlib模块进行md5操作import has ...
随机推荐
- iOS app 设计推荐
见微知著,谈移动缺省页设计 http://www.cocoachina.com/design/20150303/11186.html Facebook产品设计总监!设计APP时的14个必考题 http ...
- git操作——TortoiseGit指定某个分支clone
需求 需要使用TortoiseGit 克隆某个项目分支 操作 勾选分支,输入分支名称clone代码即可
- 三角形数且是完全平方数 2017 ACM-ICPC 亚洲区(乌鲁木齐赛区)网络赛 E.Half-consecutive Numbers
三角形数:an=n*(n+1)/2; 完全平方数:bn=c^2; 既是三角形数又是完全平方数:An=6*A(n-1)-A(n-2)+2; A[23]={ 0, 1, 8, 49, 288, 1681, ...
- 关于Spring+mybatis+PageHelper分页插件PageHelper的使用策略
把插件jar包导入项目(具体上篇有介绍http://blog.csdn.net/qq_33624284/article/details/72821811) spring-mybatis.xml文件中配 ...
- LeetCode Weekly Contest 6
leetcode现在每周末举办比赛,这是今天上午参加的比赛的题解.题目难度不算大,两个easy,一个medium,一个hard.hard题之前接触过,所以做得比较顺利. 1. Sum of Left ...
- git 练习
删除文件 git rm test.txt git commit -m 'remove test.txt' 回复到最新版本 git checkout -- test.txt git checkout ...
- mysql 忘记root密码的处理办法
参考地址: https://blog.csdn.net/vv19910825/article/details/82979563 1.修改配置文件mysql\bin\my.ini 在文本 [mysql ...
- C++第三次作业:友元类
友元类 将数据与处理数据的函数封装在一起,构成类,即实现了数据的共享又实现了隐藏,无疑是面向程序设计的一大优点,但是封装并不总是完美的,一旦需要涉及到一个类的两个对象的数据处理问题该怎么办?无论是设计 ...
- nio FileChannel中文乱码问题
最近用nio读取文件时,英文正常,读取中文时会出现乱码,经查可以用Charset类来解决: 代码如下: package com.example.demo; import java.io.FileNot ...
- Laravel 中 validation 验证 返回中文提示 全局设置
<?php return [ /* |-------------------------------------------------------------------------- | V ...