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

    # 模块分三种
    # 自定义模块
    # 内置模块 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__和* 也不是完美的,但是可以简化你的操作
    # 注意 模块名 需要符合变量命名规范
    # 导入模块的时候,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
    # 使用相对导入,不能直接执行使用了相对导入的文件
    # 必须将这个存在着相对导入的包作为一个整体来使用

    # 只有你写了一个包
    # 这个包对外提供功能,而不是用来直接执行这个包中的某个py文件的时候才会用到相对导入
  • 相关阅读:
    synchronized (lock) 买票demo 线程安全
    springboot项目搭建
    Maven命令
    Mybatis的mapper文件中$和#的用法及区别详解
    mybatis映射文件mapper.xml的写法(collections...)
    MyBatis-动态SQL的if、choose、when、otherwise、trim、where、set、foreach使用(各种标签详解), 以及实体间关系配置
    024 搭建前台系统-----乐优商城工程启动步骤教程
    023 商品管理功能03-----商品修改
    023 商品管理功能02-----商品新增
    022 商品管理功能01-----商品查询
  • 原文地址:https://www.cnblogs.com/zhaosijia/p/9321556.html
Copyright © 2011-2022 走看看