模块

1.什么是模块

  一个模块就是一个包含了python定义和声明的文件,文件名就是模块名字加上.py的后缀。

2.为何要是用模块

  如果你退出python解释器然后重新进入,那么你之前定义的函数或者变量都将丢失,因此我们通常将程序写到文件中以便永久保存下来,需要时就通过python test.py方式执行,此时test.py被称为脚本script。

  随着程序的发展,功能越来越多,为了方便管理,我们通常将程序分成一个个的文件,这样做程序的结构更清晰,方便管理。这时我们不仅仅可以把这些文件当做脚本去执行,还可以把他们当做模块来导入到其他的模块中,实现了功能的重复利用。

3.如何使用模块

3.1import

示列文件:自定义模块my_module.py,文件名my_module.py,模块名my_module

复制代码
#my_module.py
print('from the my_module.py')

money=1000

def read1():
    print('my_module->read1->money',money)

def read2():
    print('my_module->read2 calling read1')
    read1()

def change():
    global money
    money=0

my_module模块
复制代码

3.1.1

模块可以包含可执行的语句和函数的定义,这些语句的目的是初始化模块,他们只在模块第一次遇到导入import语句时才执行(import语句是可以在程序中的任意位置使用的,且针对同一个模块import多次,为了防止你重复导入,python的优化手段是:第一次导入后就将模块名加载到内存了,后续的import语句仅是对已经加载大内存中的模块对象增加了一次引用,不会重新执行模块内的语句)如下:

复制代码
#demo.py
import my_module #只在第一次导入时才执行my_module.py内代码,此处的显式效果是只打印一次'from the my_module.py',当然其他的顶级代码也都被执行了,只不过没有显示效果.
import my_module
import my_module
import my_module

'''
执行结果:
from the my_module.py
'''

demo.py
复制代码

我们可以从sys.modules中找到当前已经加载的模块,sys.modules是一个字典,内部包含模块名与模块对象的映射,该字典决定导入模块时是否需要重新导入。

3.1.2

每个模块都是一个独立的名称空间,定义在这个模块中的函数,把这个模块的名称空间当做全局名称空间,这样我们在编写自己的模块时,就不用担心我们定义在自己模块中全局变量会在被导入时,与使用者的全局变量冲突。

复制代码
#测试一:money与my_module.money不冲突
#demo.py
import my_module
money=10
print(my_module.money)

'''
执行结果:
from the my_module.py
'''

测试一:money与my_module.money不冲突
复制代码
复制代码
#测试二:read1与my_module.read1不冲突
#demo.py
import my_module
def read1():
    print('========')
my_module.read1()

'''
执行结果:
from the my_module.py
my_module->read1->money 1000
'''

测试二:read1与my_module.read1不冲突
复制代码
复制代码
#测试三:执行my_module.change()操作的全局变量money仍然是my_module中的
#demo.py
import my_module
money=1
my_module.change()
print(money)

'''
执行结果:
from the my_module.py
'''

测试三:执行my_module.change()操作的全局变量money仍然是my_module中的
复制代码
复制代码
#测试三:执行my_module.change()操作的全局变量money仍然是my_module中的
#demo.py
import my_module
money=1
my_module.change()
print(money)

'''
执行结果:
from the my_module.py
1
'''
复制代码

3.1.3总结:首次导入模块my_module时会做三件事:

 1.为源文件(my_module模块)创建新的名称空间,在my_module中定义的函数和方法若是

使用了global时访问的就是这个名称空间。

 2.在新创建的命名空间中执行模块中包含的代码,见初始导入import_module

提示:导入模块时到底执行了什么?

In fact function definitions are also ‘statements’ that are ‘executed’; the execution of a module-level function definition enters the function name in the module’s global symbol table.
事实上函数定义也是“被执行”的语句,模块级别函数定义的执行将函数名放入模块全局名称空间表,用globals()可以查看

3.创建名字my_module来引用该命名空间

这个名字和变量名没什么区别,都是‘第一类的’,且使用my_module名字的方式都可以访问my_module.py文件中定义的名字,my_module.名字与test.py的名字来自两个完全不同的地方。

3.1.4为模块名起别名,相当于m1=1,;m2=m1

import my_module as sm
print(sm.money)

示范用法一:

有两种sql模块mysql和oracle,根据用户的输入,选择不同的sql功能

 

模块搜索路径:

  模块的查找顺序是:内存中已经加载的模块-->内置模块--->sys.path路径中包含的模块。

 

posted @   逆风飞翔的博客  阅读(48)  评论(0编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
阅读排行:
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
点击右上角即可分享
微信分享提示