码迷,mamicode.com
首页 > 其他好文 > 详细

模块和包

时间:2018-08-23 19:16:27      阅读:155      评论:0      收藏:0      [点我收藏+]

标签:字典   round   bsp   包含   常见   决定   函数   丢失   没有   

一  模块                                                   

                                  什么是模块                                    

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

 但其实import加载的模块分为四个通用类别:

1 使用Python编写的代码  (.py文件)

2 已被编译为共享库或DLL的C或C++扩展

3 包好一组模块的包

4 使用C编程并连接到Python解释器的内置模块

                           2 为何要使用模块?                      

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

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

3 如何使用模块?

3.1 import

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

 1 # my_module.py
 2 print("form the my_moudle.py")
 3 
 4 money = 1000
 5 
 6 def read1():
 7     print("my_moudle->read1->monet",money)
 8     
 9 def read2():
10     print("my_moudle->read2 calling read1",)
11     read1()
12 
13 def change():
14     global money
15     money = 0

 

3.1.1                  

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

 1 # demo.py
 2 import my_module   # 只在第一次导入时才执行my_module.py 内代码,此处的显式效果是只打印一次‘from the my_module.py‘,当然其他的顶级代码也都被执行了,只不过没有显示效果
 3 import my_module
 4 import my_module
 5 import my_module
 6 
 7 
 8 
 9 #  结果
10 form the my_moudle.py

 

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

 

3.12                 

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

技术分享图片
 1 #测试一:money与my_module.money不冲突
 2 #demo.py
 3 import my_module
 4 money=10
 5 print(my_module.money)
 6 
 7 ‘‘‘
 8 执行结果:
 9 from the my_module.py
10 1000
11 ‘‘‘
测试一:money与my_module.money不冲突
技术分享图片
 1 #测试二:read1与my_module.read1不冲突
 2 #demo.py
 3 import my_module
 4 def read1():
 5     print(========)
 6 my_module.read1()
 7 
 8 ‘‘‘
 9 执行结果:
10 from the my_module.py
11 my_module->read1->money 1000
12 ‘‘‘
测试二:read1与my_module.read1不冲突
技术分享图片
 1 #测试二:read1与my_module.read1不冲突
 2 #demo.py
 3 import my_module
 4 def read1():
 5     print(========)
 6 my_module.read1()
 7 
 8 ‘‘‘
 9 执行结果:
10 from the my_module.py
11 my_module->read1->money 1000
12 ‘‘‘
测试三:my_module.change()操作的全局变量money仍然是my_module中的

 

3.13       

总结:首次导入模块my_modlule是会做三件事:

1.为源文件(my_module模块)创建新的名称空间,在my_module中定义的函数和方法若是使用到了global是访问的就是这个名称空间.

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

 

模块和包

标签:字典   round   bsp   包含   常见   决定   函数   丢失   没有   

原文地址:https://www.cnblogs.com/heshun/p/9525143.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!