zoukankan      html  css  js  c++  java
  • 模块和包

    一. 模块的导入

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

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

      

  • 相关阅读:
    矩阵树定理 / 生成树计数
    NC20811 蓝魔法师 (树形DP/树上01背包)
    Xor-MST学习/ 2020牛客暑假多校(五)B.Graph
    HDU-6820 Tree (2020杭电多校(五) 1007)
    Flipping Coins (概率DP)
    宝石装箱 容斥+dp
    Rabbit的工作(1) (dP)
    Codeforces-1350 E.Orac and Game of Life
    HDU-6563 Strength (贪心)
    HDU-6558 The Moon (期望DP)
  • 原文地址:https://www.cnblogs.com/NachoLau/p/9526919.html
Copyright © 2011-2022 走看看