美文网首页
16_Python模块的导入_全栈开发学习笔记

16_Python模块的导入_全栈开发学习笔记

作者: 豆行僧 | 来源:发表于2019-02-01 21:17 被阅读0次

    1. 模块导入的顺序

    内置模块
    扩展的 django
    自定义的


    2. import

    先创建demo.py文件:

    print("in demo.py")
    
    money = 100
    
    def read():
        print("in read1")
    

    再到另一py文件写上:

    import demo
    
    demo.read()
    
    print(demo.money)
    

    执行结果:

    in demo.py
    in read1
    100
    

    3. 模块导入的流程

    先从sys.modules里查看是否已经被导入
    如果没有被导入,就依据sys.path路径取寻找模块
    找到了就导入
    创建这个模块的命名空间
    执行文件,把文件中的名字都放到命名空间里

    范例:

    import demo
    import sys
    
    print(sys.modules.keys())
    print(sys.path)
    

    执行结果:

    in demo.py
    dict_keys(['locale', 'heapq', 'errno', 'types', '_weakref', 'io', 'demo', 'reprlib', 'functools', 'encodings', '_thread', '_locale', 'operator', 'sre_constants', 'copyreg', '_heapq', 'winreg', '_imp', '_functools', '_operator', '_bootlocale', 'sys', 'encodings.mbcs', '__main__', 'ntpath', 'encodings.latin_1', 'weakref', '_io', 'sre_compile', 'signal', '_codecs', 'encodings.gbk', 'zipimport', 'site', 'abc', 'encodings.utf_8', 'sre_parse', 'nt', '_codecs_cn', 'keyword', '_warnings', '_collections', 'genericpath', 're', '_collections_abc', 'os', 'encodings.aliases', 'itertools', 'marshal', 'os.path', '_weakrefset', 'codecs', 'collections', '_stat', '_multibytecodec', 'stat', '_frozen_importlib', '_sre', 'builtins'])
    ['D:\\temp_study\\python01', 'D:\\temp_study\\python01', 'C:\\WINDOWS\\SYSTEM32\\python34.zip', 'D:\\temp_study\\python01\\venv\\DLLs', 'D:\\temp_study\\python01\\venv\\lib', 'D:\\temp_study\\python01\\venv\\Scripts', 'D:\\Python34\\Lib', 'D:\\Python34\\DLLs', 'D:\\temp_study\\python01\\venv', 'D:\\temp_study\\python01\\venv\\lib\\site-packages']
    

    4. 给模块起别名

    import time as t
    
    print(t.time())
    

    执行结果:

    1548923779.046172
    

    起别名的用法:

    # oracle
    # mysql
    # if 数据库 == ‘oracle’:
    #     import oracle as db
    # elif 数据库 == ‘mysql’:
    #     import mysql as db
    # # 连接数据库   db.connect
    # # 登录认证
    # # 增删改查
    # # 关闭数据库
    

    5. from ... import ...

    demo.py文件

    print("in demo.py")
    
    money = 100
    
    def read():
        print("in read1",money)
    

    一次范例:

    from demo import read
    read()
    

    执行结果:

    in demo.py
    in read1 100
    

    二次范例:

    from demo import read
    def read():
        print('my read')
    read()
    

    执行结果:

    in demo.py
    my read
    

    6. _name_

    范例:
    正式代码不显示模块中的内容
    demo.py

    def login():
        print("正在执行登录程序")
    
    if __name__ == "__main__":
        ret = login()
        print(ret)
    

    执行结果:

    正在执行登录程序
    None
    

    test.py

    import demo
    

    执行结果:

    无内容
    

    7. 小结

    所有的模块导入都应该尽量往上写
        内置模块
        扩展模块
        自定义模块
    模块不会重复被导入 : sys.moudles
    从哪儿导入模块 : sys.path
    import
    import 模块名
        模块名.变量名 和本文件中的变量名完全不冲突
    import 模块名 as 重命名的模块名 : 提高代码的兼容性
    import 模块1,模块2
    
    from import
    from 模块名 import 变量名
        直接使用 变量名 就可以完成操作
        如果本文件中有相同的变量名会发生冲突
    from 模块名 import 变量名字 as 重命名变量名
    from 模块名 import 变量名1,变量名2
    from 模块名 import *
        将模块中的所有变量名都放到内存中
        如果本文件中有相同的变量名会发生冲突
    from 模块名 import * 和 __all__ 是一对
        没有这个变量,就会导入所有的名字
        如果有all 只导入all列表中的名字
    __name__
    在模块中 有一个变量__name__,
    当我们直接执行这个模块的时候,__name__ == '__main__'
    当我们执行其他模块,在其他模块中引用这个模块的时候,这个模块中的__name__ == '模块的名字'
    

    相关文章

      网友评论

          本文标题:16_Python模块的导入_全栈开发学习笔记

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