美文网首页
模块与包

模块与包

作者: 慕知 | 来源:发表于2021-08-24 18:42 被阅读0次

    一,模块

    1, 什么是模块?

    1 使用python编写的.py文件
    
    2 把一系列模块组织到一起的文件夹(注:文件夹下有一个__init__.py文件,该文件夹称之为包)
    
    

    2,为什么用模块?

    #1、从文件级别组织程序,更方便管理
    随着程序的发展,功能越来越多,为了方便管理,我们通常将程序分成一个个的文件,这样做程序的结构更清晰,方便管理。这时我们不仅仅可以把这些文件当做脚本去执行,还可以把他们当做模块来导入到其他的模块中,实现了功能的重复利用
    
    #2、拿来主义,提升开发效率
    同样的原理,我们也可以下载别人写好的模块然后导入到自己的项目中使用,这种拿来主义,可以极大地提升我们的开发效率
    
    #ps:
    如果你退出python解释器然后重新进入,那么你之前定义的函数或者变量都将丢失,因此我们通常将程序写到文件中以便永久保存下来,需要时就通过python test.py方式去执行,此时test.py被称为脚本script。
    
    

    3,模块的使用

    1) 使用

    import +模块名
    
    第一次导入的三件事:(重复导入只会饮用之前加载好的结果)
    1)产生一个新的名称空间,要导用的那个ph文件
    2)运行要导入的模块代码,产生的名字存放于1的名称空间,运行过程中global关键字指向的就是该名称空间
    3)在当前名称空间拿到一个名字spam,改名字指向1的名称空间
    
    

    2) 示例

    2.1) 模块基础使用
    spam.py内容如下:
    # 一个模块就是一个包含了一组功能的python文件,比如spam.py,
    # 模块名为spam,可以通过import spam使用。
    
    money=10
    def read1():
        print('spam模块',money)
    
    def read2():
        print('spam')
        read1()
    
    def change():
        global money
        money=0
    
    
    
    
    打开一个新文件,导入spam.py
    import spam
    print(spam.money)
    #10
    
    
    
    
    #被导入的模块在执行过程中使用自己独立的 名称空间作为全局名称空间
    import spam
    money=666       #在当前空间定义money(spam里也有money变量)
    print(spam.money)         # 调用的依然是spam模块的变量,不受影响
    #10
    
    
    
    
    2.2) 起别名
    import spam as f
    f.read1()
    # spam模块 10
    
    
    
    2.3) 只调用模块的部分功能
    from spam import read1
    read1()
    # spam模块 10
    
    
    
    # # 调用没有指定的功能会报错
    from spam import read1
    read2()      
    # NameError: name 'read2' is not defined
    
    
    
    
    
    PS:
    优点:引用时简单,不用加前缀
    缺点:容易与当前名称空间起冲突,未导入的名字不能用
    
    from spam import read1
    def read1():
        print('aaaa')
        
    read1()
    # aaaa
    
    2.4) 导入多个名字
    from spam import read1,read2
    read1()
    read2()
    # spam模块 10
    # spam
    # spam模块 10
    
    
    
    
    
    
    2.5) all的使用
    
    #   *的使用(如果不想让*导入的名字,在定义名字前面加一个_下划线)
    spam.py内容如下:
    _money=10
    
    
    # 调用(不推荐使用,可读性差,可能会与当前空间名混淆)
    from spam import *       
    print(money)
        print(money)
    # NameError: name 'money' is not defined
    
    
    
    
    
    
    # __all__的使用
    __all__=['read1','money']       # 指定说明*只能导入的名字
    money=10
    def read1():
        print('spam模块',money)
    
    def read2():
        print('spam')
        read1()
    
    def change():
        global money
        money=0
    
    
    
    # 以上只指定了read1和money,则read2和change都不可以调用使用
    from spam import *
    read1()
    # spam模块 10
    
    read2()   # 报错,因为在spam指定了__all__
    # NameError: name 'read2' is not defined
    
    

    3) py文件的2种用途

    1.当作脚本执行
    money=10
    def read1():
        print('spam模块',money)
    
    def read2():
        print('spam')
        read1()
    
    def change():
        global money
        money=0
    
    
    
    
    print(__name__)
    # __main__
    
    
    
    2.当作模块执行
    # 导入模块执行
    
    import spam
    # spam
    
    
    
    3.使用
    if __name__ == '__main__':
        foo.py被当做脚本执行时运行的代码
    else:
        foo.py被当做模块导入时运行的代码
    
    
    
    money=10
    def read1():
        print('spam模块',money)
    
    def read2():
        print('spam')
        read1()
    
    def change():
        global money
        money=0
    
    if __name__ == '__main__':
        read1()
        read2()
        change()
        print('调试功能')
    # spam模块 10
    # spam
    # spam模块 10
    # 调试功能
    
    
    
    
    
    
    
    
    import spam
    spam.read1()
    # spam
    # spam模块 10
    
    

    4,模块的搜索路径

    优先级:
    内存 -->  内置模块 --> 自定义(sys.path)
    如果调用的模块与执行的py不在同一路径下,会报错
    
    
    
    # 查看当前加载到内存的变量
    import sys
    print(sys.modules)
    
    
    
    
    
    
    #如果导入的模块和执行py不在同一级别的文件夹下,会报错,需要自定义环境变量,如下:
    
    示例:(文件夹如下图)
    
    # 方式一
    import sys
    sys.path.append(r'/Users/sg/PycharmProjects/py-study/模块与包')
    import spam
    print(spam.money)
    # 10
    
    
    # 方式二
    #执行程序会把执行程序的文件夹加载到环境比那里中,所以也可以直接执行以下:
    from 模块与包 import spam
    print(spam.money)
    # 10
    
    
    
    模块搜索路径

    二,包

    1,包的定义

    什么是包?
    --包就是一个包含了__init__.py文件的文件夹(可以往该文件夹下防疫队模块)
    
    
    1)一个包下面的文件调用
    
    #例1 (如图1)
    import package
    print(package.x)
    # 1
    
    在init里的内容为x=1
    
    
    
    图1
    2)不同的包路径调用(加入环境变量)
    不同的包路径互相调用,需要加上路径,如下pack3这个包下面的test.py去调用package1包下面的m1里面的mu
    
    加入环境变量即可
    
    
    不同的包路径调用

    相关文章

      网友评论

          本文标题:模块与包

          本文链接:https://www.haomeiwen.com/subject/kbyciltx.html