大纲 :
# 模块分三种
# 自定义模块
# 内置模块 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__和* 也不是完美的,但是可以简化你的操作
# 自定义模块
# 内置模块 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
# 选课系统
# 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()
# 相当于执行了这个被导入的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
# 1.都写在文件的开始
# 2.顺序: 先导入内置的,再导入扩展的,最后导入自定义的
import os
import sys
import flask # 扩展的web框架
import requests # 请求url
import requests # 请求url
import my_module
# 3.导入多个模块
# import os as o,sys as s,flask as f
# os.remove()
# sys.path
# 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
# 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 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()
# print(flag)
# read1()
# 如果你导入一个模块 这个模块中假设有20个方法
# 你只用一个 from 模块 import 这个方法
# 你用10个 import 模块
# from import *
# def time():
# print('time.time')
# from my_module import *
# time()
# 你只用一个 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这个列表中的名字可以被*导入
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()