Python--模块和包

Python模块和包

1、什么是模块:

Python 标准库中包含了大量的模块(称为标准模块),还有大量的第三方模块,开发者自己也可以开发自定义模块。通过这些强大的模块可以极大地提高开发者的开发效率。

模块就是 Python 程序。

模块可以比作一盒积木,通过它可以拼出多种主题的玩具,这与前面介绍的函数不同,一个函数仅相当于一块积木,而一个模块(.py 文件)中可以包含多个函数,也就是很多积木。

  • 随着程序功能的复杂,程序体积会不断变大,为了便于维护,通常会将其分为多个文件(模块),这样不仅可以提高代码的可维护性,还可以提高代码的可重用性。

代码的可重用性体现在,当编写好一个模块后,只要编程过程中需要用到该模块中的某个功能(由变量、函数、类实现),无需做重复性的编写工作,直接在程序中导入该模块即可使用该功能。

前面讲了很多封装:

  • 诸多容器,例如列表、元组、字符串、字典等,它们都是对数据的封装;
  • 函数是对 Python 代码的封装;
  • 类是对方法和属性的封装,也可以说是对函数和数据的封装。
  • 模块也是一种封装,把能够实现某一特定功能的代码编写在同一个 .py 文件中。

2、模块导入:

借助 Python 现有的标准库或者其他人提供的第三方库。

两种导入方式:

  • import 模块名1 [as 别名1], 模块名2 [as 别名2],…

  • from 模块名 import 成员名1 [as 别名1],成员名2 [as 别名2],…

# 导入sys整个模块
import sys
# 使用sys模块名作为前缀来访问模块中的成员
print(sys.argv[0])

# argv[0] 用于获取当前 Python 程序的存储路径

给模块起别名:

import sys as s
# 使用s模块别名作为前缀来访问模块中的成员
print(s.argv[0])

一次性导入多个模块:

import sys,os
# 使用模块名作为前缀来访问模块中的成员
print(sys.argv[0])
# os模块的sep变量代表平台上的路径分隔符
print(os.sep)

导入多个模块分别指定别名:

# 导入sys、os两个模块,并为sys指定别名s,为os指定别名o
import sys as s,os as o

下面这种方法是指定模块内的成员名:

from 模块名 import 成员名 as 别名:

from sys import argv
# 使用导入成员的语法,直接使用成员名访问
print(argv[0])

为成员指定别名:

# 导入sys模块的argv成员,并为其指定别名v
from sys import argv as v
# 使用导入成员(并指定别名)的语法,直接使用成员的别名访问
print(v[0])

一次导入多个成员:

# 导入sys模块的argv,winver成员
from sys import argv, winver
# 使用导入成员的语法,直接使用成员名访问
print(argv[0])
print(winver)

3、自定义模块:

name = "Python教程"
add = "http://c.biancheng.net/python"
print(name,add)
def say():
    print("人生苦短,我学Python!")
class CLanguage:
    def __init__(self,name,add):
        self.name = name
        self.add = add
    def say(self):
        print(self.name,self.add)

if __name__ == '__main__':
    say()
    clangs = CLanguage("C语言中文网","http://c.biancheng.net")
    clangs.say()

在test02.py文件下执行,可以得到:

Python教程 http://c.biancheng.net/python
人生苦短,我学Python!
C语言中文网 http://c.biancheng.net

在test01.py下执行:

Python教程 http://c.biancheng.net/python

测试函数只有在直接运行模块文件时才执行,则可在调用测试函数时增加判断,即只有当 name ==‘main’ 时才调用测试函数。

4、__all__用法:

当我们向文件导入某个模块时,导入的是该模块中那些名称不以下划线(单下划线“_”或者双下划线“__”)开头的变量、函数和类。因此,如果我们不想模块文件中的某个成员被引入到其它文件中使用,可以在其名称前添加下划线。

以前面章节中创建的 demo.py 模块文件和 test.py 文件为例(它们位于同一目录),各自包含的内容如下所示:

#demo.py
def say():
    print("人生苦短,我学Python!")
def hello():
    print("hello:china")
def show():
    print("Python教程:http://c.biancheng.net/python")
    
    
#test.py
from demo import *
say()
hello()
show()

执行 test.py 文件:

人生苦短,我学Python!
C语言中文网:http://c.biancheng.net
Python教程:http://c.biancheng.net/python

如果 demo.py 模块中的 show() 函数不想让其它文件引入,则只需将其名称改为 _show() 或者 __show()。

通过在模块文件中设置 all 变量,当其它文件以“from 模块名 import *”的形式导入该模块时,该文件中只能使用 all 列表中指定的成员。

只有以“from 模块名 import *”形式导入的模块,当该模块设有 all 变量时,只能导入该变量指定的成员,未指定的成员是无法导入的。

def say():
    print("人生苦短,我学Python!")
def CLanguage():
    print("C语言中文网:http://c.biancheng.net")
def disPython():
    print("Python教程:http://c.biancheng.net/python")
__all__ = ["say","CLanguage"]

上面代码中,只能显示出say()和CLanguage()。

再次声明,all 变量仅限于在其它文件中以“from 模块名 import *”的方式引入。也就是说,如果使用以下 2 种方式引入模块,则 all 变量的设置是无效的。

5、Python包:

包就是文件夹,只不过在该文件夹下必须存在一个名为“init.py” 的文件。

每个包的目录下都必须建立一个 init.py 的模块,可以是一个空模块,可以写一些初始化代码,其作用就是告诉 Python 要将该目录当成包来处理。

注意,init.py 不同于其他模块文件,此模块的模块名不是 init,而是它所在的包名。例如,在 settings 包中的 init.py 文件,其模块名就是 settings。

Python 库:相比模块和包,库是一个更大的概念,例如在 Python 标准库中的每个库都有好多个包,而每个包中都有若干个模块。

python包的导入:

  • import 包名[.模块名 [as 别名]]
  • from 包名 import 模块名 [as 别名]
  • from 包名.模块名 import 成员名 [as 别名]

6、查看文档:

1、查看模块成员:

dir() 函数:

import string
print(dir(string))

all 变量:

import string
print(string.__all__)

2、查看文档和帮助信息:

  • 使用 help() 函数来获取指定成员(甚至是该模块)的帮助信息。
import my_package
help(my_package.module1)
  • doc 变量获取其说明文档:
import my_package
print(my_package.module1.display.__doc__)

其实,help() 函数底层也是借助 doc 属性实现的。

3、查看模块的源文件路径:

通过 file 属性查找该模块(或包)文件所在的具体存储位置,直接查看其源代码。

import my_package
print(my_package.__file__)

注意,并不是所有模块都提供 file 属性,因为并不是所有模块的实现都采用 Python 语言,有些模块采用的是其它编程语言(如 C 语言)。

猜你喜欢

转载自blog.csdn.net/weixin_53060366/article/details/130192448