东尧爱分享
这是东尧每天一篇文章的第31天
东尧写文章的目标:分享东尧的经验和思考,帮你获取物质和精神两方面幸福。
昨天的文章中我们已经讲了模块的含义和如何导入模块。在网上有很多第三方模块都有现成的功能可供使用,那么,这些第三方模块如何安装和导入呢?如果模块间名字有重合又该怎么重命名呢?这都是我们今天要分享的内容。
1
安装第三方模块
在Python中,安装第三方模块,是通过包管理工具pip完成的。例如,我们要安装一个第三方库——requests,安装它的命令就是:
pip install requests
耐心等待下载并安装后,就可以使用requests了。
2
Python模块内函数和变量的作用域
在一个模块中,我们可能会定义很多函数和变量,但有的函数和变量我们希望给别人使用,有的函数和变量我们希望仅仅在模块内部使用。在Python中,是通过_前缀来实现的。
正常的函数和变量名是公开的(public),可以被直接引用,比如:abc,x123,PI等;
类似__xxx__这样的变量是特殊变量,可以被直接引用,但是有特殊用途,我们自己的变量一般不要用这种变量名;
类似_xxx和__xxx这样的函数或变量就是非公开的(private),不应该被直接引用,比如_abc,__abc等;
之所以我们说,private函数和变量“不应该”被直接引用,而不是“不能”被直接引用,是因为Python并没有一种方法可以完全限制访问private函数或变量,但是,从编程习惯上不应该引用private函数或变量。
private函数或变量不应该被别人引用,那它们有什么用呢?请看例子:
def _private_1(name):
return 'Hello, %s' % name
def _private_2(name):
return 'Hi, %s' % name
def greeting(name):
if len(name) > 3:
return _private_1(name)
else:
return _private_2(name)
我们在模块里公开greeting()函数,而把内部逻辑用private函数隐藏起来了,这样,调用greeting()函数不用关心内部的private函数细节,这也是一种非常有用的代码封装和抽象的方法,即:
外部不需要引用的函数全部定义成private,只有外部需要引用的函数才定义为public。
3
from-import语句
你可以在你的模块里面导入指定的模块属性。也就是把指定名称导入到当前作用域。使用from-import语句可以实现,它的语法是:from module import name1[,name2[,name3...]]
例如,我们如果只使用到random模块的randint方法,那么我们可以这么做:
# 从random模块导入randint和randrange属性
from random import randint,randrange
# 这样就可以直接使用randint方法,而不需要在前面加random(random.randint()),如下:
a = randint(1,100)
print(a)
* 星号代表导入模块的全部方法,比如下面的语句就会将random模块里面所以可以导出的属性和方法都加载到当前模块的作用域。但是一般不推荐这样子写,因为有可能会导致名称冲突。比如其他的模块里面也有一个randint方法,这样的话就会导致名称冲突了:
from random import *
4
扩展的import语句(as)
有时候你导入的模块或者是模块属性名称已经在你的程序中使用了,或者你不想使用导入的名字。可能是他太长不变输入什么的,总之你不喜欢他。想给他换个名字,那么就可以使用as语句来给模块或属性方法等起别名,然后在程序中使用这个别名即可。(as语句对导入的模块命名也同样适用)
# 把random模块重命名为rd
import random as rd
num = rd.randint(1, 100)
#把randint重命名为rdn
from random import randint as rdn
num = rdn(1, 100)
5
包相关知识
如果不同的人编写的模块名相同怎么办?为了避免模块名冲突,Python又引入了按目录来组织模块的方法,称为包(Package)。
包是一个有层次的文件目录结构,它定义了一个由模块和子包组成的python应用程序执行环境。包主要用来帮助解决如下问题:
1.为平坦名称空间假如有层次的组织结构;
2.允许程序员把有联系的模块组合到一起;
3.允许分发者使用目录结构而不是一大堆混乱的文件;
4.帮助解决有冲突的模块名称。
与类和模块相同,包也使用句点属性标识符(点号)来访问他们的元素。使用标准的import和from-import语句导入包中的模块。
举个例子,一个abc.py的文件就是一个名字叫abc的模块,一个xyz.py的文件就是一个名字叫xyz的模块。现在,假设我们的abc和xyz这两个模块名字与其他模块冲突了,于是我们可以通过包来组织模块,避免冲突。方法是选择一个顶层包名,比如mycompany,按照如下目录存放:
mycompany
├─ __init__.py
├─ abc.py
└─ xyz.py
引入了包以后,只要顶层的包名不与别人冲突,那所有模块都不会与别人冲突。现在,abc.py模块的名字就变成了mycompany.abc,类似的,xyz.py的模块名变成了mycompany.xyz。
请注意,每一个包目录下面都会有一个__init__.py的文件,这个文件是必须存在的,否则,Python就把这个目录当成普通目录,而不是一个包。__init__.py可以是空文件,也可以有Python代码,因为__init__.py本身就是一个模块,而它的模块名就是mycompany。
所以说包其实就是一个目录里面多个一个 init .py文件,当我们导入包的时候会自动的执行 init .py里面得代码(初始化)。一般情况下,如果我们不需要在包导入的时候就执行代码的话,那么 init .py文件留空即可。
领取专属 10元无门槛券
私享最新 技术干货