模块自定义

  上节说了有关模块的知识,当时所说的模块都是内置模块,现在来看自己定制的模块,即模块也可以自定义。

  模块的自定义就是指写一段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
'''
View Code

相关文章:

  • 2021-04-16
  • 2021-07-28
  • 2021-06-25
  • 2021-10-02
  • 2021-09-10
猜你喜欢
  • 2021-11-02
  • 2022-01-07
  • 2022-12-23
  • 2022-12-23
  • 2022-01-18
  • 2021-11-23
  • 2021-12-22
相关资源
相似解决方案