深入解析Python模块引入机制
这是菜鸟学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吧 长按下方的二维码即可关注.