模块详解第二天:重命名模块、第三方模块、包

东尧爱分享

这是东尧每天一篇文章的第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文件留空即可。

  • 发表于:
  • 原文链接:http://kuaibao.qq.com/s/20180508G0Q81F00?refer=cp_1026
  • 腾讯「云+社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。

扫码关注云+社区

领取腾讯云代金券