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()