模块自定义
上节说了有关模块的知识,当时所说的模块都是内置模块,现在来看自己定制的模块,即模块也可以自定义。
模块的自定义就是指写一段python文件,一般情况下里面包含了可执行的语句和函数的定义,其实自定义的模块和内置模块的效果一样,都是使以后程序的操作更加方便,不用重复敲一样的代码,直接导入模块就可以使用。导入方式与内置模块相同,import+文件名,当然,自定义的模块增加了许多其他的导入方式,下文我们会详细介绍。
需要特别注意的是:我们自定义的模块名不应该与系统内置模块重名。
现在我们来自定义一个模块:
#my_moudle.py print('from the my_moudle.py') money=1000 def read1(): print('my_moudle->read1->money',money) def read2(): print('my_moudle->read2 calling read1') read1() def change(): global money money=0
接下来就是示例模块的导入操作:
#另一个文件 import my_moudle #只在第一次导入时才执行my_moudle.py内代码,此处的显式效果是只打印一次'from the my_moudle.py',当然其他的顶级代码也都被执行了,只不过没有显示效果. import my_moudle#都没被执行 import my_moudle#都没被执行 import my_moudle#都没被执行 ''' 执行结果: from the my_moudle.py '''
注:我们可以从sys.module中找到当前已经加载的模块,sys.module是一个字典,内部包含模块名与模块对象的映射,该字典决定了导入模块时是否需要重新导入。
每一个模块都是独立的命名空间,程序在导入模块的时候就已经开辟了一个独立的名称空间,这样也就是说如果我们在程序的全局中给一个变量赋值,但恰好模块中也存在这个变量时,模块中的该变量的值不会被更改,我们赋值的那个变量存在于全局中,也就是说无论我们在文件中怎么操作,都不会改变模块中的内容。
注:其实是有一个方式可以改变模块中的内容的,但我们不会去那么做,因为这意味着你辛苦创建的模块会被别人篡改,就存在着很大的风险
下面我们进行一个小测试,自定义的模块即上文中的my_moudle
#测试一:money与my_moudle.money不冲突 #demo.py import my_moudle money=10 print(my_moudle.money)#全局中的赋值不会改变模块中相同变量的值 ''' 执行结果: from the my_moudle.py 1000 ''' #测试二:read1与my_moudle.read1不冲突 #demo.py import my_moudle def read1(): print('========') my_moudle.read1()#就算新定义了一个与模块中的函数同名的函数,也不会改变什么,只是在全局中存在了一个新的函数 ''' 执行结果: from the my_moudle.py my_moudle->read1->money 1000 ''' #测试三:执行my_moudle.change()操作的全局变量money仍然是my_moudle中的 #demo.py import my_moudle money=1 my_moudle.change() print(money)#此时模块中的变量值被改变,这就是改变模块内容的方法,不推荐使用 ''' 执行结果: from the my_moudle.py 1 '''