模块和包

一. 模块的导入

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

模块有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

  

 

posted @ 2018-08-23 22:24  NachoLau  阅读(155)  评论(0编辑  收藏  举报