• python 包和模块 有固定的包格式自己注意


    大纲 :

    # 模块分三种
        # 自定义模块
        # 内置模块 time re sys os
        # 第三方模块/扩展模块
    # 自定义模块  *****
        # 模块的创建 导入 模块名
        # import
            # 模块的命名空间
            # 在导入模块的时候发生了什么?
                # 那么这个模块的名字能够找到这个模块所在的内存空间,任意使用里面的名字
            # 为模块起别名  as
            # 导入多个模块
        # from import
            # 模块的命名空间
            # 在导入模块的时候发生了什么?
                # 只导入模块中的某一个名字,其他没有导入的不能直接使用
            # 为模块起别名 as
            # 导入多个名字
                # 可以 from 模块 import 名字1,名字2
                # 也可以 from 模块 import *  一般情况下不用
                    # *和__all__
        # 模块的循环引用 - 一定会报错
        # 模块的加载与修改(了解)
            # import importlib
            # importlib.reload(模块名)
        # 把模块当做脚本来执行(*****)
            # if __name__ == '__main__'下面的代码只有在直接执行这个文件的时候才被执行
        # 模块搜索路径
            # sys.path
            # 第一个元素 是你当前执行的py文件所在的目录
            # 所以同目录下的py文件的导入都不会报错
            # 如果要导入的文件不是同目录下的,需要自己修改sys.path目录
    # 包 ***
        # 导入模块 常用的
            # import
            # from import
        # 导入包
            # __init__文件  在导入包的时候执行这个包下的__init__方法
            # 绝对导入,永远要注意路径的问题
            # 相对导入,永远不要直接执行使用了相对导入的文件
            # __all__和* 也不是完美的,但是可以简化你的操作
    # 软件的开发规范 *****
        # 选课系统
        # ftp
    一模块的创建
    注意:模块名要符合变量的命名规范
      导入模块的时候,pycharm提示报错是不可靠的
      导入一个模块 就是import 文件名 不带.py
    import my_module 导入模块
    二 模块的导入
    1.模块导入的过程到底做了哪些事?
    # 相当于执行了这个被导入的py文件
    # 这个模块不会被重复导入
    # import sys
    # print(sys.modules)
    # 内存中所有被导入的模块都会存储在sys.modules字典中
    # 这个字典的key是这个模块的名字,value是这个模块的内存地址
    # import my_module
    # print(sys.modules['my_module'])
    # print(my_module)
    # 模块导入之后 可以直接使用这个模块中的函数 和 变量
    # print(my_module.flag)
    # my_module.read1()
    # my_module.read2()
    #
    # def read2():
    #     print('in my read2')
    # flag = False
    # my_module.read2()
    # 模块的命名空间
        # 每一个模块的导入都会创建一个属于自己的命名空间
    # 在导入模块的时候发生了什么?
        # 1.创建一个属于这个模块的命名空间
        # 2.执行这个模块中的代码
        # 3.创建一个引用来调用这个模块命名空间中的名字
        # 4.把导入的模块和内存地址存到sys.modules中
    # import my_module as m
    # 可以给导入的模块进行重命名,重命名之后新的名字会出现在内存空间中来作为模块的引用
    # 但是原模块名就不能在文件中使用了
    # import configparser as conf
    # m.read2()
    # 序列化
    # json pickle
    # 你提供序列化功能,帮助用户对***进行序列化
    # def dump(somthing,m = 'json'):
    #     if m == 'json':import json as m
    #     else:import pickle as m
    #     m.dumps(somthing)
    # 数据库
    # oracle oracle_db
    # mysql mysql_db
    # if db_name == 'mysql':# import mysql_db as db
    # elif db_name == 'oracle': import oracle_db as db
    # db.connect()
    # db.exec()
    #  导入多个模块
    # 1.都写在文件的开始
    # 2.顺序: 先导入内置的,再导入扩展的,最后导入自定义的
    import os
    import sys
    import flask    # 扩展的web框架
    import requests # 请求url
    import my_module
    # 3.导入多个模块
    # import os as o,sys as s,flask as f
    # os.remove()
    # sys.path
     
     
     import my_module
    # 导入这个模块 相当于执行一个模块
    # 导入模块 模块名作为这个模块命名空间的一个引用
    # 可以使用模块名 随意的使用这个命名空间中的名字
    # from my_module import flag
    # from import 仍然会在导入模块的时候执行整个模块
    # 仍然会把模块中所有的名字存在一个属于这个模块的命名空间中
    # 区别在于 使用模块中名字的时候不需要再带着模块名
    # 而是 导入了 什么名字 就能用什么名字
    # 没有导入的名字不能使用
    # flag = False
    # print(flag)
    # read2()
    # my_module.read1()
    # 都会完整的执行这个my_module文件
    # 没被导入的其他名字就不能用了
    # 导入多个名字和重命名语法
    # from my_module import flag as f,read1 as r1
    # from my_module import read2
    # read2()
    # print(f)
    # from my_module import *  #==>from my_module import flag,read1,read2
    # print(flag)
    # read1()
    # 如果你导入一个模块 这个模块中假设有20个方法
    # 你只用一个 from 模块 import 这个方法
    # 你用10个   import 模块
    # from import *
    # def time():
    #     print('time.time')
    # from my_module import *
    # time()
    from my_module import read2
    read2()
    # __all__只和*相关
    # 如果不定义__all__,默认*可以导入这个模块中的所有名字
    # 如果定义了__all__,那么只有出现在all这个列表中的名字可以被*导入
     
    import time
    import importlib
    
    import my_module
    print(my_module.flag)
    time.sleep(20)
    importlib.reload(my_module)   # 测试
    print(my_module.flag)
    

     把模块当做脚本来执行

    from my_module import login
    # __name__是py文件中的一个内置的变量
        # 当你直接执行这个py文件的时候,这个文件中的__name__就是'__main__'
        # 当你以模块的形式导入这个py文件的时候,这个文件中的__name__就是模块名的字符串
    # __file__
    
    if __name__ == '__main__':
        # 写在这段代码下面的所有内容只有在当前py文件被直接run的时候才会执行
        # 被导入的时候不会被执行
        pass
    
    # main # table会自动补全
    # 脚本 : 就是一个被直接执行run的文件
    

     模块搜素路径

    # import sys
    # print(sys.path)
    # 导入模块的时候,从这个列表中的目录下去找
    # sys.path.append(r'E:sylarpython_workspaceday31homework')
    # import core
    # core.login()
    

      包

    # 要使用get方法 得先导入policy
    # import glance.api.policy  #只能也必须精确到模块
    # glance.api.policy.get()
    
    # import glance.api.policy  as policy  #只能也必须精确到模块
    # policy.get()
    
    # from glance.api import policy
    
    # policy.get()
    
    # 如果导入的是一个包的名字而不是一个py文件的名字
    # 就会直接执行这个包下面的__init__.py
    # 除此之外什么也不会做
    import sys
    # print(sys.path)
    # import glance  # -->init-->import api
    # glance.api.policy.get()
    
    import glance
    # 使用相对导入,不能直接执行使用了相对导入的文件
    # 必须将这个存在着相对导入的包作为一个整体来使用
    
    # 只有你写了一个包
    # 这个包对外提供功能,而不是用来直接执行这个包中的
    

      

    __all__ = ['read1','flag']
    # print('hahaha')
    flag = True
    def read1():
        print('read1')
    
    def read2():
        print('read2',flag)
    
    def time():
        print('in time')
    # print('HAHAHA')
    # read1()
    
    def login():
        print('login')
    
    if __name__ == '__main__':
        login()
    

     

     

     

     
  • 相关阅读:
    SonarQube
    Gerrit
    Jenkins
    Jenkins
    GitLab
    GitLab
    GitLab
    centos7配置国内yum源
    CentOS7 ping: unknown host www.baidu.com
    VirtualBox下安装CentOS7系统
  • 原文地址:https://www.cnblogs.com/lnrick/p/9319892.html
Copyright © 2020-2023  润新知