29 day of python
模块和包
模块的命名空间
每一个模块的导入都会创建一个属于自己的命名空间
在导入模块的时候发生了什么?
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 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这个列表中的名字可以被*导入
__all__ = ['read1','flag']
模块的加载与修改
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:\sylar\python_workspace\day31\homework')
# 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文件的时候才会用到相对导入

浙公网安备 33010602011771号