Python模块(Module)详解

    xiaoxiao2023-10-30  140

    文章目录

    一、模块概念二、模块导入与使用2.0 准备工作2.1 import2.1.1 导入2.1.2 使用 2.2 from...import2.2.1 导入2.2.2 使用2.3 from...import * 三、模块扩展3.1 搜索路径3.2 加载顺序3.3 别名3.4 模块规范 四、小结

    一、模块概念

    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解释器对模块的搜索(加载)顺序如下:

    当前目录如果不在当前目录,Python则搜索shell变量PYTHONPATH下的每个目录如果都搜索不到,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关键字,可以在不同模块存在相同的函数名和变量名。但切记不要和系统内置的模块名称重复。
    最新回复(0)