zoukankan      html  css  js  c++  java
  • Day25 python基础---面向对象进阶--模块与包

    一,模块

      import:

      Q1:在import的过程中发生了哪些事情

        相当于执行了这个模块,但是一个模块不能被重复导入

      Q2:被导入的模块和本文件之间命名空间的关系

       import模块的时候发生的事情

        1.寻找模块

        2.如果找到了,就开辟一块空间,执行这个模块

        3.把这个模块中用到的名字都收录到新开辟的空间中

        4.创建一个变量来引用这个模块的空间

       导入模块时需要注意:

        1.模块不会被重复导入

        2.模块和文件之间的内存空间始终是隔离的

        3.模块的名字必须是符合变量命名规范的

    # 使用被导入模块中的名字
    import my_modul2
    print(my_module2.name)
    my_module2.read1()
    name = 'alex'
    print(name)
    #可以修改模块内变量的指向
    import my_module2
    my_module2.read12()
    name = 'alex'
    my_module2.read12()
    my_module2.name = 'alex'
    my_module2.read12()

      Q3:导入多个模块的方法   

    #导入多个模块
    import time,os,my_module2
    
    #注意:pep8规范
    import time
    import os
    import my_module2
    #内置,第三方,自定义,规范需要按顺序导入

      Q4:给导入的模块起别名

    #给模块起别名,起了别名,原来的模块名就不能用
    import my_module2 as m
    print(m.name)
    print(my_module2.name)  #NameError: name 'my_module2' is not defined
    
    #应用:
    def dump(method):
        if method == 'json':
            import json as m
        elif method == 'pickle':
            import pickle as m
        with open('file', 'w') as f:
            m.dump([1,2,3],f)

      Q5:模块搜索路径

    # 模块搜索路径
    import sys
    print(sys.path)
    import my_module2
    
    #正常的sys.path中除了内置。扩展模块所在的路径之外
    #只有一个路径是永远不会出问题
        #你直接执行的这个文件所在的目录,sys.path的第一个是正确的
        #sys.path第二个是项目目录,不靠谱
    #一个模块是否能被导入,就看这个模块所在的目录在不在sys.path中
    import my_module3  #ModuleNotFoundError: No module named 'my_module3'  路径出问题

      Q5:模块与脚本的关系

    #两种运行一个py文件的方式
    #直接运行它:cmd python xx.py    pycahrm  : 脚本
    #执行一个脚本时__name__ ==> '__nain__'
    #导入它 :模块 #当这个脚本被当成模块导入时 #__name__ ==> '模块名'

      关于:if __name__ == '__main___'

    if __name__ == '__main__':
    若本作为模块被导入时,将不需要执行的代码放入其中
    函数调用和打印操作一般放在此主函数下
    若不是直接执行本文件的话,主函数不会被执行

      

      from ... import

      Q1.在from import的过程中发生了哪些时期

        1.寻找模块

        2.如果找到了,就开辟一块空间,执行这个模块

        3.把这个模块中用到的名字都收录到新开辟的空间中

        4.创建一个变量来引用这个模块的空间

      Q2:被导入的内容和本文件之间命名空间的关系

    from my_module2 import read1
    read1()
    from my_module2 import read12   #readl2有引用模块内的变量name
    name = 'alex'  #创建一个全局变量并指向'alex'
    read12()    #两个名称空间互相隔绝,不受影响
    import sys
    print(sys.modules)
    
    
    name = 'alex'    # 创建一个全局变量并指向'alex'
    from my_module2 import name   #把模块空间内的变量name指向全局变量name
    print('name')

      Q3:from import多个内容,给导入的内容起别名,*和__all__用法

    from my_module2 import name,read1,read12 #同时导入多个
    from my_module2 import name as n,read1 as r1,read12 as r2  #同时导入多个并重命名
    from my_module import *  #导入全部,正常情况,该模块内用的小的化,不建议使用,可读性差
    __all__ = ['name'] #在模块中定义,可跟*配合,有定义的导入后才能用,没定义导入后不能用

      

      补充:

    # 补充的内容
    #1.pyc文件,pyi文件  *
        #pyc:被编译好的字节码模块文件,当模块第一次被导入时会产生一个pyc文件,当第二次被导入
    #时,就直接执行编译好的pyc模块文件,当模块源码变更时,会重新编译生成pyc文件
        #可以提高程序的启动效率,并不能提高执行效率
    
        #pyi:与py后缀差别不大
    
    #2.模块的导入和修改 *
    import time
    import my_module2   #导入时就已经在内存加载好,在期间修改模块,程序执行不受影响
    print(my_module2.name)
    time.sleep(10)     #在期间修改模
    print(my_module2.name)
    import my_module2   #不能多次导入,不生效
    print(my_module2.name)
    from importlib import reload #不建议多次reload模块,影响程序执行效率 import time import my_module print(my_module2.name) time.sleep(10) #在期间修改模块 reload(my_module2) #可以重新加载模块 print(my_module2.name) #3.模块的循环引用 **** #当使用循环引用时,会造成两边的模块内的代码还没有加载完成就结束导入,导致引用失败 #可以先单当面引用,待一边加载完成后,再(条件)触发另一边的引用,实现循环引用 #4.dir(模块名) *** import my_module2 print(dir(my_module2)) #可以获取这个模块中的所有名字,并可以利用反射获取

    二,包

      Q1:什么是包(package)

        含有一个__init__.py的文件夹就是一个包

        包中通常含有一些py文件

        提供一组复杂的功能

        在py3中,模块可以相互导入

        在py2中,在同一个中的模块才能互相导入

      Q2:从包中导入模块

    #从包中导入模块 ****
    
    import  glance2.api.policy  #这个形式终点必须是一个模块
    # import  glance2.api.policy.get  #error:点的左边必须是一个包,不能是一个模块
    glance2.api.policy.get()
    
    import  glance2.api.policy as policy #起别名
    policy.get()
    
    
    from  glance2.api import policy   #from import 形式
    policy.get()
    from glance2.api.policy import get
    get()

      Q3:直接导入包 **

    # 绝对导入
    
    #导入包的过程发生了什么事?
    #相当于执行了这个包的__init__.py文件
    #sys.path的内容 永远是当期你执行的文件
    glance2.api.policy.get()
    
    #相对导入  
    #运用了相对导入的文件不能直接执行
    #'.'表示当前目录
    #'..'表示上级目录
    # import glance3
    from outer import glance3

        

  • 相关阅读:
    LeetCode Product of Array Except Self
    python基础学习笔记(十)
    python基础学习笔记(九)
    python基础学习笔记(八)
    python基础学习笔记(六)
    python基础学习笔记(七)
    python基础学习笔记(五)
    python基础学习笔记(一)
    python基础学习笔记(三)
    python基础学习笔记(四)
  • 原文地址:https://www.cnblogs.com/lianyeah/p/9606908.html
Copyright © 2011-2022 走看看