• Python基础(15)_python模块、包


    一、模块

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

      模块的本质:模块的本质是一个py文件

    2、模块分为三类:1)内置模块;2)第三方模块;3)自定义模块

    3、使用模块的目的:

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

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

    4、模块的使用:通过import 调用

    import 模块名   在调用模块时,其实是将模块文件路径加入到sys.path的第一个位置

    import的两个过程:

      1、创建新的名称空间   {名字:对象}

      2、执行被调用的模块   (第二次调用时不会被执行)

    示例文件:创建模块,spam.py,文件名spam.py,模块名spam

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

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

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

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

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

    #测试一:money与spam.money不冲突
    #test.py
    import spam 
    money=10
    print(spam.money)
    
    '''
    执行结果:
    from the spam.py
    1000
    '''
    #测试二:read1与spam.read1不冲突
    #test.py
    import spam
    def read1():
        print('========')
    spam.read1()
    
    '''
    执行结果:
    from the spam.py
    spam->read1->money 1000
    '''
    
    #测试三:执行spam.change()操作的全局变量money仍然是spam中的
    #test.py
    import spam
    money=1
    spam.change()
    print(money)
    
    '''
    执行结果:
    from the spam.py
    1
    '''
    

      

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

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

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

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

    1.#为模块名起别名,相当于m1=1;m2=m1 
    2.import spam as sm
    3.print(sm.money)
    
    #在一行导入多个模块
    1.import sys,os,re
    

    2 from…import 语句 

    from modname import name1[, name2[, ... nameN]]

    这个声明不会把整个modulename模块导入到当前的命名空间中,只会将它里面的name1或name2单个引入到执行这个声明的模块的全局符号表。

    其中, from…import* 语句提供了一个简单的方法来导入一个模块中的所有项目。然而这种声明不该被过多地使用。大多数情况, Python程序员不使用这种方法,因为引入的其它来源的命名,很可能覆盖了已有的定义。

    二、包(package)

      如果不同的人编写的模块名相同怎么办?为了避免模块名冲突,Python又引入了按目录来组织模块的方法,称为包(Package)

      在python中,包可以理解成一个文件夹,但是每一个文件夹(包)里必须要有一个__init__文件

      每一个包目录下面都会有一个__init__.py的文件,这个文件是必须存在的,否则,Python就把这个目录当成普通目录(文件夹),而不是一个包。__init__.py可以是空文件,也可以有Python代码,因为__init__.py本身就是一个模块,而它的模块名就是对应包的名字。

    调用包就是执行包下的__init__.py文件

  • 相关阅读:
    高性能Ajax
    git基本操作
    文本字数过多时,以省略号显示
    前端开发环境工具汇总
    无阻赛的脚本(js脚本延迟方法)
    SparkContext的初始化(伯篇)——运行环境与元数据清理器
    java中的内部类和匿名内部类的使用
    SpringMVC拦截器中通过反射得到Controller方法注解时ClassCastException解决方式
    EM算法-数学原理及其证明
    Eclipse 创建 Maven 项目、Maven JavaWeb 项目
  • 原文地址:https://www.cnblogs.com/hedeyong/p/7090539.html
Copyright © 2020-2023  润新知