Python模块(Module)详解

一、模块概念

Python模块(Module),是一个Python文件,以.py结尾,包含Python对象定义和Python语句。
模块能定义函数、类和变量,也可以包含可执行的代码。

白话如下:

  • 每一个以扩展名 py 结尾的 Python 源代码文件都是一个 模块
  • 模块名 同样也是一个 标识符,需要符合标识符的命名规则
  • 在模块中定义的 全局变量 、函数、类 都是提供给外界直接使用的 工具
  • 模块 就好比是 工具包,要想使用这个工具包中的工具,就需要先 导入 这个模块

二、模块导入与使用

2.0 准备工作

编写模块:wc_module01.py,代码如下:

title = '旺财模块01'


def say_hello():
    print('hello wc01')


class Student:
    pass

编写模块:wc_module02.py,代码如下:

title = '旺财模块02'


def say_hello():
    print('hello wc02')


class Teacher:
    pass

2.1 import
2.1.1 导入

可以通过import关键字导入模块,如下:

import module1,module2...

如果导入多个模块,以逗号相隔,不过不建议这么做,应采取每个模块独占一行的方式,如下:

import module1
import module2
...

eg.

import wc_module01
import wc_module02
2.1.2 使用

模块导入之后,可以通过模块名.方式使用提供的工具—函数、类、全局变量
示例如下:

import wc_module01
import wc_module02

wc_module01.say_hello()
wc_module02.say_hello()
print(wc_module01.title)
print(wc_module02.title)
print(wc_module01.Student())
print(wc_module02.Teacher())

输出如下:

hello wc01
hello wc02
旺财模块01
旺财模块02
<wc_module01.Student object at 0x1030522e8>
<wc_module02.Teacher object at 0x1030522e8>
2.2 from…import
2.2.1 导入

如果希望从某一个模块导入部分指定工具,可以使用from import的方式,如下:

from 模块名 import 工具名

示例如下:

from wc_module01 import say_hello
from wc_module02 import Teacher
2.2.2 使用

通过这种方式导入,不需要再通过模块名,可以直接使用其提供的工具—函数、类、全局变量
示例如下:

from wc_module01 import say_hello
from wc_module02 import Teacher

say_hello()
print(Teacher())

输出结果为:

hello wc01
<wc_module02.Teacher object at 0x103937668>
2.3 from…import *

from module import *是指一次性导入模块的所有工具,该方式不建议使用,一个是效率问题,再一个也不方便问题排查,这里也就不再赘述了。

三、模块扩展

3.1 搜索路径

当导入一个模块时,Python解释器对模块的搜索(加载)顺序如下:

  1. 当前目录
  2. 如果不在当前目录,Python则搜索shell变量PYTHONPATH下的每个目录
  3. 如果都搜索不到,Python则会查看默认路径,在Linux中,默认路径一般为/usr/local/lib/python/

有了如上加载顺序,我们在开发过程中,也需要主要模块名的命名,不要与系统的模块名重名。
示例:

import random

# 生成一个 0~10 的数字
rand = random.randint(0, 10)

print(rand)

如果当前目录存在random.py文件的话,那么此时程序运行就会挂掉了。因为这个时候,Python解释器会加载当前目录下的random.py,而不会加载系统的random模块。

3.2 加载顺序

如果两个模块存在同名函数,那么后导入的模块会覆盖之前导入模块的函数,其他全局变量、类也是同样的道理。

在开发时,导入模块相关代码应统一写在代码的顶部,通过开发工具,更能及时发现问题。

3.3 别名

如果模块名过长两个模块存在同名冲突时,可以通过as关键字给其中一个模块起别名的方式解决。

from 模块名 import 工具名 as 别名

这样,后续可以通过别名进行模块工具的调用。
示例如下:

from wc_module01 import say_hello as hello01

hello01()
3.4 模块规范

通过之前的描述,已经知道,每一个python文件都是一个模块,那么在导入模块时,模块中所有没有任何缩进的代码都会被执行一遍。
在实际开发中,模块开发人员会做一些测试代码,而这些测试代码又不希望在模块被引用时被动执行,此外对于调用者来说,是不应该看到或执行这些测试代码的,那么应该怎么做呢?

接下来,__name__隆重出场了。

  • __name__是Python的一个内置属性,记录着一个字符串
  • 如果是被其他文件导入的,__name__的值就是模块名
  • 如果是当前执行的程序,那么__name__的值就是__main__

因此,在很多Python文件中会看到以下格式的代码:

# 导入模块
# 定义全局变量
# 定义类
# 定义函数

# 在代码的最下方
def main():
    # ...
    pass

# 根据 __name__ 判断是否执行下方代码
if __name__ == "__main__":
    main()

这样,既方便模块开发者测试,又不会对引入该模块者造成影响。

四、小结

Python中模块开发的好处多多,优点多多,总结起来如下:

  • 提高了代码的可维护性
  • 提取重复或工具代码,提高开发效率
  • 通过as关键字,可以在不同模块存在相同的函数名和变量名。但切记不要和系统内置的模块名称重复。
  • 19
    点赞
  • 86
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值