博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
模块和包
阅读量:7111 次
发布时间:2019-06-28

本文共 3158 字,大约阅读时间需要 10 分钟。

一. 模块的导入

已经写好的一组函数 变量 方法 放在一个文件里 (这个文件可以被我们直接使用)这个文件就是个模块

模块有py dll文件 zip文件

自己写一个模块 创建一个py文件,给它起一个 符合变量名命名规则的名字,这个名字就是模块名

导入一个模块就是执行一个模块

import的命名空间,模块和当前文件在不同的命名空间中

模块被重复导入时 会直接略过 不会再执行一次

 

使用my_module模块中的名字    print(my_module.name)    print(my_module.read1)    my_module.read1()判断模块是否已导入    import sys    print(sys.modules)给模块起别名,起了别名之后,使用这个模块就都使用别名引用变量了 这样模块名较长时 可以降低长度 再执行my_module就无效了    import my_module as m    m.read1()    还可以这样用    json pickle    dumps loads    def func(dic,t = 'json'):        if t == 'json':            import json            return json.dumps(dic)        elif t == 'pickle':            import pickle            return pickle.dumps(dic)        def func(dic, t='json'):        if t == 'json':            import json as aaa        elif t == 'pickle':            import pickle as aaa        return aaa.dumps(dic)导入多个模块    import os,time    import os as o,time as t在模块中的变量名如果在外部的脚本文件中出现了, 并在脚本文件中定义了, 是不会改变这个模块内部引用这个变量名的* 和 __all__, __all__能够约束*导入的变量的内容在__init__中第一行写 __all__ = ['name','read1','read2'], 在import * 时, 会导入列表中的变量    from my_module import *    print(name)    read1()    read2()在脚本执行时, 已经import的模块会写进内存, 在运行中修改模块文件不会产生效果, 如果要执行修改的模块, 可以用reload这个函数    import importlib    importlib.reload(my_module)执行一个py文件的方式:    在cmd执行,在python执行 : 直接执行这个文件 - 以脚本的形式运行这个文件    导入这个文件都是py文件    直接运行这个文件 这个文件就是一个脚本    导入这个文件     这个文件就是一个模块当一个py文件    当做一个脚本的时候 : 能够独立的提供一个功能,能自主完成交互    当成一个模块的时候 : 能够被导入这调用这个功能,不能自主交互一个文件中的__name__变量    当这个文件被当做脚本执行的时候 __name__ == '__main__'    当这个文件被当做模块导入的时候 __name__ == '模块的名字'可以在模块的文件中输入main, 同时按tab键if __name__ == '__main__':    print(func())import的路径添加    import sys    import my_module    # 不在路径里    print(sys.path)    path = r'D:\python\模块和包'    sys.path.append(path)

  

二. 包

包是几个模块的集合, 文件夹中有一个__init__.py文件

 

从包中导入模块1.import    import glance.api.policy    glance.api.policy.get()        import glance.api.policy as policy    policy.get()2.from import    from glance.api import policy    policy.get()        from glance.api.policy import get    get()直接导入包 ,需要通过设计init文件,来完成导入包之后的操作导入一个包 相当于执行了这个包下面的__init__.py文件导入一个包后, 如果__init__文件是空的, 包下面的文件夹和py文件都不会加载绝对导入 :在执行一个py脚本的时候,这个脚本以及和这个脚本同级的模块中只能用绝对导入, 相对导入需要把init放在和这个脚本同级的一个包的下面在api下面的__init__.py不能写import policy, 因为在调用api这个包的时候是在glance下执行的在直接调用时, 要在每个包的__init__.py里写上from glance import api, 在api下的包需要写from glance.api import policy这样在导入这个报的时候, 就相当于直接加载了这个包的所有的py文件缺点所有的导入都要从一个根目录下往后解释文件夹之间的关系如果当前导入包的文件和被导入的包的位置关系发生了变化,那么所有的init文件都要做相应的调整    from glance.api.policy import get()     # 只导入policy模块的get()函数    get()    from glance.api import policy           # 只导入policy包    policy    import glance                           # 在glance的init文件写好了的情况下, 导入glance一个包可以直接导入这个包的全部模块    glance下的init要这么写from glance import api    glance下的api包下的init要这么写from glance.api import policy相对导入 :不需要去反复的修改路径 只要一个包中的所有文件夹和文件的相对位置不发生改变不需要去关心当前这个包和被执行的文件之间的层级关系缺点含有相对导入的py文件不能被直接执行必须放在包中被导入的调用才能正常的使用如果要导入一个模块, 这个模块和现在执行的脚本在同一个目录下, 这个模块也不能用from . import xxx    import glance    glance.api.policy.get()    from binance import glance2     # glance是binance下的一个包    glance2.api.policy.get()    glance下的init文件要这么写from . import api

  

 

转载于:https://www.cnblogs.com/NachoLau/p/9526919.html

你可能感兴趣的文章
js省市联动
查看>>
bzoj 4868: [Shoi2017]期末考试
查看>>
django(一)--- 安装django
查看>>
assetBundle打包脚本与LUA
查看>>
运用python抓取博客园首页的所有数据,而且定时持续抓取新公布的内容存入mongodb中...
查看>>
转 Python Selenium设计模式-POM
查看>>
vue.js应用开发笔记
查看>>
学习开淘宝网店
查看>>
计算机网络之物理层笔记
查看>>
Spring的Hello World工程
查看>>
linux可视化桌面安装
查看>>
Redis学习之路(002)- Ubuntu下redis开放端口
查看>>
本地调用jni之VC++无法导入问题
查看>>
C语言实现---学生成绩管理系统
查看>>
Handling PnP Paging Request
查看>>
eclipse启动时弹出Failed to create the Java Virtual Machine
查看>>
Spring Web工程web.xml零配置即使用Java Config + Annotation
查看>>
couchbase的备份与恢复命令
查看>>
[转]谈NAND Flash的底层结构和解析
查看>>
JDBC实例代码
查看>>