深入解析Python模块引入机制

浏览: 1479

这是菜鸟学python的第24篇原创文章


阅读本文大概需要5分钟

讲完了函数的一些概念,我们来说Python的模块引入,python里面有大量的现成的模块可以使用,不用我们自己造轮子。

1.模块的好处:

a).打个比方我们要造一个自行车,我们并不需要去制造橡胶,钢筋,轮胎,我们只需要买一些现成的轮子,龙头,把手,组装一下就可以了。Python也是这样,我们有的时候代码需要一些功能,而这些功能在标准库里面或者第三方库里面早就写好我的,我们要做的就是引入而已.

b).当你的代码量变大的时候,你肯定需要封装和抽象,要提高可维护性,必须要把你的功能函数模块化.

c).模块还可以避免函数名和变量名冲突。相同名字的函数和变量完全可以分别存在不同的模块中,java里面也有类似的概念.

2.模块的种类:

1)用户自己写的自定义模块

2)Python标准库模块

3)第三方模块//通过pip install 

有人说,说了这么多,到底Python模块物理上是什么,其实就是一个文件,一个python文件而已.模块的文件名就是模块的名字加上扩展名.py.(聪明的同学一定会问若有两个相同名字的模块怎么区别,哇都会抢答了,先放一下我最后回答).

下面我们从一个小例子,'2行代码看优酷视频'来带领大家走进我们今天的话题.

import webbrowser

webbrowser.open("http://v.youku.com/v_show/id_XNDc2NDk5OTI0.html?from=s1.8-1-1.2&spm=a2h0k.8191407.0.0")

这两行代码就能看打开浏览器然后看一个视频,这个链接是Google创始人在密西根大学的一个演讲.是不是很神奇,2行搞定,其实就是引入一个模块(用现成的模块就是爽,哈哈),然后调用里面的open函数搞定了.

webbrowser其实是一个文件叫webbrowser.py 里面有一个open函数.

webbrowser.py

   def open():

    ...

下面我们就详细讲一下

假设你有一个HiPython目录,它的结构如下:

|-----__init__.py

|-----main.py

|-----sched.py

里面有3个文件__init__.py,main.py和sched.py ,这3个文件我解释一下:

  • 一个目录要想作为python的模块包必须含有__init__.py这个文件夹(这是python设定死的,原因是因为python设计的时候搜索到目录下有这个特殊文件认为这个目录是python的模块包否则就是普通目录)

  • main.py是我们自己写的一个python文件

  • sched.py也我们自己写的,有人说这个名字怎么和python标准库里面的名字一样啊,要的就是这效果,我们接着讲~~

====sched.py===

a=100

====main.py====

import sched

print sched.a

>>100

我们看看执行main.py的时候发生了什么,首先引入了sched模块,这个模块的名字其实和标准库里面的是一模一样的。但是为啥调用我们的自己的模块,而不是标准库里面的.这是python模块搜索机制决定的.

3.Python的模块搜索机制:

1)程序的当前目录

2)PYTHONPATH目录,也就是环境变量里面设置的PYTHON目录

3)标准库的目录

当前目录:

也就是你程序运行的主目录,Python会首先在主目录内搜索导入的文件,这个目录总是被先搜索.

PYTHONPATH目录:

有同学会说这个是什么东东,这个其实就是环境变量,一般安装程序之后都会电脑上面设置一些环境变量的路径。不行你话win用户你可以在

我的电脑/高级系统设置/高级/环境变量 点开看看

标准库的目录:

Python自动搜索标准库安装在机器上的那些目录,比如C:\Python27\lib

说了这么多大家也许不信,大家可以敲一下

import sys

print('The PYTHONPATH is', sys.path)

里面就是包含里python 模块搜索目录list,看一下你就茅塞顿开啦!

4.模块引用的形式

1).import module

这种是完全引入,比如import os ,就会把os下面的所有的变量,函数,类全部引入。然后你调用模块的函数只需要敲os.listdir(),就可以调用里面的listdir()函数。

但是这种引入会有一个弊端,就是有一些函数你不需要用到,但是因为你的全部引入,这样当你引入外部模块很多的时候,比较浪费性能,开销比较大,所以我们推荐第二种引入方法

2).from module import printer

部分引入,就是你只引入你需要的函数,而且还有一个好处就是直接在脚本中使用复制后的变量名。

比如直接敲printer('Hi Python')而不用敲module.printer('Hi Python'),可以少敲一些字

3).import module as xx

这其实就是别名,比如import numpy as np ,其实就是少敲一些字,np是numpy的别名而已.

5.import和from都是赋值语句

就跟def一样,import和from都是可执行语句,而不是编译期间的声明。千万要记住python的动态编译的,只有到执行的时候,python才会运行这些语言.而且可以套嵌在if语句中,如果大家看过一些开源库的源代码就会发现有大量的这样的用法.

结束今天的topic之前回答开头留下的问题,张三开发了一个abc.py模块,李四开发了一个abc.py模块,如何区分呢,其实很简单是通过Python包来区分的,这一点和其他语言都是一样的.


最后说一下Python标准库里有很多现成的非常好的模块,对于初学者有的时候想查看这些模块的详细用法。这里我推荐大家去看官方的文档链接:https://docs.python.org ,然后选择你对应的Python版本是2.7还是py3.5的,里面有模块的每一个api用法介绍和实例,非常有用.




好了Python的模块引入机制就讲到这里啦,希望能给初学者一些启发,若有什么不懂的,也可以留言跟我探讨交流.

最后说一下,原创真的不易,希望大家能够给点支持,欢迎转发,留言,也是对我的一点鼓励和动力.

也欢迎更多喜欢Python的同学关注 菜鸟学python,一起来学python吧 长按下方的二维码即可关注.


推荐 0
本文由 菜鸟学Python 创作,采用 知识共享署名-相同方式共享 3.0 中国大陆许可协议 进行许可。
转载、引用前需联系作者,并署名作者且注明文章出处。
本站文章版权归原作者及原出处所有 。内容为作者个人观点, 并不代表本站赞同其观点和对其真实性负责。本站是一个个人学习交流的平台,并不用于任何商业目的,如果有任何问题,请及时联系我们,我们将根据著作权人的要求,立即更正或者删除有关内容。本站拥有对此声明的最终解释权。

0 个评论

要回复文章请先登录注册