模块 ,包

# 模块
# 模块的分类
# 内置模块 :
# 安装python解释器的时候跟着装的那些方法
# 第三方模块/扩展模块 :
# 没在安装python解释器的时候安装的那些功能
# 自定义模块:
# 自己写的功能如果是一个通用的的功能,那就能把它当作一个模块

# 什么是模块
# 有的功能开发者自己无法完成,这样的话需要借助已经实现的函数\类来完成这些功能,如果实现不了
# 的功能都由别人替你实现了
# 操作系统打交道
# 和时间
# 1000取随机数
# 压缩一个文件
# 和网络通信
# 别人写的一组功能 文件夹/py文件/c语言编译好的一些编译文件
#
# 为什么要有模块?
# 分类 管理方法
# 节省内存
# 提供更多的功能

# 模块怎么用?在哪儿用?
#import my_module # 要导入一个py文件的名字,但是不加.py后缀名
#import my_module #模块的名字必须要满足变量的命名规范
#一般 情况下 模块都是小写字母开头的名字

#import 这个语句相等于什么?
# import 这个模块相等于执行了这个模块所在的py文件

#一个模块不会被重复导入

#如何使用模块
# import my_module
# def login():
# print('in mine login')
# name='heiehie'
# login()
# my_module.login()
# print(my_module.login())

# 模块的重命名 用 as
# import os,my_module #注 可以用逗号隔开导入多个模块,但命名规范用多行导入模块
# 比如
# import os
# import my_module
# PEP8规范
# 所有的模块导入都应该尽量放在这个文件的开头
# 模块的导入也有顺序的: 先导入内置模块,再导入第三方模块,最后导入自定义模块


# ******************************************************************
# 为什么要有模块
# 模块分为哪几种
# import
# import 的时候发生了什么
# 在import的时候命名空间的变换
# 重命名
# 一行导入多个模块
# from ... import ...
# from import 的时候发生了什么
# 在import的时候命名空间的变换
# 重命名 as
# 一行导入多个名字
# from 模块 import *
# * 和 __all__ 的相关性
# 模块相关的其他知识
# 1.把模块当成脚本运行 : 从本模块中反射本模块中的变量
# if __name__ == '__main__':
# 所有不需要调用就能执行的内容
# import sys
# getattr(sys.modules[__name__],'要反射的变量名')
# 2.模块搜索路径 sys.path
# 3.pyc编译文件
# 4.重新加载模块 已经导入的模块即便被修改在程序执行过程中也不会生效
# 5.模块的循环引用 - 不允许
# 包 ***
# 什么是包? 集合了一组py文件 提供了一组复杂功能的
# 为什么要有包? 当提供的功能比较复杂,一个py文件写不下的时候
# 包中都有什么? 至少拥有一个__init__.py
# 直接导入模块
# import 包.包.模块
# 包.包.模块.变量
# from 包.包 import 模块 # 推荐 平时写作业的过程
# 模块.变量
# 导入包 读框架源码的时候
# 如要希望导入包之后 模块能够正常的使用 那么需要自己去完成init文件的开发
# 包中模块的 绝对导入
# 包中模块的 相对导入
# 使用了相对导入的模块只能被当做模块执行
# 不能被当做脚本执行
# ******************************************************************
# import qwe
# qwe.login()

# from qwe import *
# login()
# 不是python解释器发现的错误,而是pycharm根据它的一些判断而得出的结论

# from import 的时候发生了什么 仍然相当于执行了整个py文件
# 在from import的时候命名空间的变换
# 导入了什么 就能使用什么 不导入的变量 不能使用
# 不导入并不意味着不存 而是没有建立文件到模块中其他名字的引用
# def login(): print('in my login')
# 当模块中导入的方法或者变量 和 本文件重名的时候,那么这个名字只代表最后一次对它赋值的哪个方法或者变量
# login()
# from my_module import login
# login()
# from my_module import name
# print(name)
# 在本文件中对全局变量的修改是完全不会影响到模块中的变量引用的

# 重命名
# from my_module import login as l
# l()

# 导入多个
# from my_module import login,name
# login()
# print(name)
# name = '太亮'
# login()

# 导入多个之后再重命名
# from my_module import login as l,name as n

# from 模块 import *
# from my_module import *
# login()
# name

# __all__可以控制*导入的内容
# from my_module import *
# login()
# from my_module import name
# print(name)

# 运行一个py文件的两种方式
# 1.以模块的形式运行
# import my_module
# if __name__ == '__main__':
# my_module.login()
# 2.直接pycharm运行 cmd运行
# ----以脚本的形式运行
# 那么需要在本文件中直接打印的代码上加上
# if __name__ == '__main__':

# import sys
# import my_module
# sys.modules
# {'sys':文件的内存地址,
# 'my_module': my_module的地址
# '__main__':当前直接执行文件所在的地址}
# 存储了所有导入的文件的名字和这个文件的内存地址

# 再使用反射自己模块中的内容的时候
# import sys
# getattr(sys.modules[__name__],变量名)

# import sys
# print(sys.path)
# sys.path.append('D:\sylar\python_workspace')
# import aaa
# 模块没导入之前在硬盘上
# 安装python
# python整个包的结构不变
# 它会记录一个安装目录
# 其他所有目录都是根据安装目录来写死的
# 'D:\\sylar\\python_workspace\\day22', 是你当前运行的脚本所在的目录
# 'D:\\sylar\\python_workspace\\day22' 是pycharm在你打开项目的时候给你添加进来的项目根目录
# 剩余所有都是python内置的目录
# 内置模块的导入
# 第三方模块的导入
# 内置模块的导入和第三方模块的导入都不需要你操心了
# 自定义的模块能否被导入
# 看sys.path当中 是否存在你要导入的文件 所在的目录
# 总结
# 模块的搜索路径全部存储在sys.path列表中
# 导入模块的顺序,是从前到后找到一个符合条件的模块就立即停止不再向后寻找
# 如果要导入的模块和当前执行的文件同级
# 直接导入即可
# 如果要导入的模块和当前执行的文件不同级
# 需要把要导入模块的绝对路径添加到sys.path列表中

# import aaa
# import time
# import importlib
# aaa.login()
# time.sleep(20)
# importlib.reload(aaa) # 表示重新加载 并且在修改脚本并要运行脚本才生效
# aaa.login()

# 在import之后 再修改这个被导入的模块
# 程序感知不到

# reload这种方式可以强制程序再重新导入这个模块一次
# 非常不推荐你使用

# 在模块的导入中 不要产生循环引用问题
# 如果发生循环导入了
# 就会发现明明写在这个模块中的方法,确偏显示找不到


# import glance.api.policy
# glance.api.policy.get()

# import glance.api.policy as policy
# policy.get()

# from glance.api import policy
# policy.get()

# 导入包 相当于执行了这个包下面的__init__.py
# import glance
# # 设计一下init文件来完成一些模块的导入
# glance.api.policy.get()
# glance.db.models

# from aaa import glance

# from aaa import glance2
# glance2.api.policy.get()

# ***********************************************************************************************
# import 模块
# 导入这个模块之后 模块内的所有名字 就都可以通过模块来引用了
# 模块名.名字

# from 模块 import 名字
# 导入这个模块中的某个名字之后,这个名字就可以直接使用了
# 名字是变量 直接用
# 名字是函数 函数名()就是调用
# 名字是类名 类名()就是实例化

# 模块的循环引用 - 不能

# 把模块当成脚本运行 :
# 你希望 某一段代码 在被当做模块导入的时候 不要执行
# 就把它卸载 if __name__ == '__main__':下面

# sys.path 一个自定义模块能否被导入,就看sys.path列表中有没有这个模块所在的绝对路径
# import 模块名 # ModuleNotFoundError : No module named '模块名'

# 包
# 从包中导入模块,要注意这个包所在的目录是否在sys.path
# from aaa.bbb.ccc import get # 正确的
# from bbb.ccc import get # ModuleNotFoundError: No module named 'bbb'
# get.func()

# 如果是直接导入一个包,那么相当于执行了这个包中的__init__文件
# 并不会帮你把这个包下面的其他包以及py文件自动的导入到内存
# 如果你希望直接导入包之后,所有的这个包下面的其他包以及py文件都能直接通过包来引用
# 那么你要自己处理__init__文件

猜你喜欢

转载自www.cnblogs.com/xdlzs/p/9424842.html