模块

十八、模块

模块:分为模块和包的形式。

通过对其它模块的引用,直接使用别的程序定义的变量,方法等,提高编程效率。

当一个文件为第一个运行,__init__ 属性== ‘__main__’ , 我们可以把它叫做主程序,引用其它模块来使程序运行。
当文件被当做模块导入到其它程序,它的__init__ 属性==’__模块名__’ 

导入模块的顺序:
内置模块
第三方模块
自定义模块:命名为纯小写字母加下划线

一个python文件就是一个模块,模块名就是.py前面的

模块的四种形式:
py文件
已被编译成共享库、dll等的c或c++扩展
把一系列模块组织到一起的文件夹,包,必须有一个__init__.py文件
用c编写并连接到python解释器的内置模块

导入模块的形式:

1)import 模块

首次导入模块要执行模块代码,产生名称空间,在当前文件中产生名字模块名,指向了模块运行的名称空间,之后的调入,不再执行
import foo
foo.x
import foo1,foo2

import ... as ...

可以在函数内导入模块





if __name__ == '__main__':
    pass

当程序是主程序的时候,运行代码

当程序是主程序运行,它的name是'__main__'
被导入到别的程序时,它的name是'foo',也就是模块名


2)from foo import get

不存在foo这个名字

3)from foo import *

导入所有公有变量,方法,
该调用语句只能在最顶层使用,不能再在其它函数中以这种方式调用包中的变量,方法,

SyntaxError: import * only allowed at module level

但是,from ...import 具体的变量或者方法  的这条语句,就能在函数调用中使用

__all__ = ['变量','方法']
关于__all__:https://www.jb51.net/article/126875.htm
在模块中设置这个变量,在导入为*时,只能导入其中的变量和方法
该列表中所有的元素必须是字符串类型,每个元素对应foo.py中的一个名字

as:可以灵活运用起别名,判断不同的名字的模块一次执行其中一个,将他们都变为
一个名字,那么调用方式就统一了起来


关于导入中的问题:‘史’上雕花

循环导入:两个模块互相导入

解决方案:
方案一:导入语句放到最后,保证在导入时,所有名字都已经加载过
方案二:导入语句放到函数中,只有在调用函数时才会执行其内部代码

查找模块的优先级:

先从内存找,内置模块
然后从sys.path找:

运行文件的所在文件夹(永远不变,不管是终端运行还是pycharm运行),pycharm项
目的文件夹,第二个当不存在,因为在终端运行就变了,第三个也和pycharm有关,解
释器的压缩包,解释器文件夹,

sys.path.append(r'...')

定义一个模块的格式:

模块说明
导入模块
全局变量
类
方法
If __init__ == ‘__main__’:
pass

sys模块
sys.path  # 环境变量
sys.path.append()  # 添加你想添加的路径
sys.modules  # 保存添加到程序中的模块,直到程序运行完成,才能释放

Python对模块导入的优化机制,一经导入,即使不再引用,也保存在空间里,直到程序结束,能提高程序的运行效率

类型提示:3.5 及以上

提示函数中形参的类型
def func(name:'提示信息',age:int = 11,hobbies:tuple)->int:
    pass

.__annotations__  查看提示信息

python 语言:解释型 强类型 动态型

模块的另一种模式:包

包含有__init__文件的文件夹
python2:
导入包,运行的是__init__文件,没有__init__就报错了
python3:没有__init__文件,也不会报错

包内可以有子模块,或子包

导入包,本质上就是执行包内的__init__文件
所以说,要把包里其他模块import到__init__中

绝对导入,从顶级目录也就是当前文件夹,import,通用的导入方式
from foo.foo1 import f1

相对导入:.当前文件夹  .. 上层文件夹,不能超出顶级文件夹,推荐相对导入
from .foo1 import f1
from a.b.c import f1
a,b 一定是包,只有最后一级c才允许是模块

相对导入只能用from module import symbol的形式,import ..versions语法是不对的,且symbol只能是一个明确的名字
from pool import futures.process #语法错误
from pool.futures import process #语法正确

环境变量是以主程序为准,确定了主程序后,sys.path的值就是确定的以主程序为准的
所以__init__,导入

os 和 sys 模块:

__file__当前文件的绝对路径
os.path.dirname()  看文件夹的名字
sys.path[0] 是绝对文件夹的路径,,,注意path方法的特征

rename覆盖原来的可以
replace的应用,是否有重复的
posted @ 2020-03-26 19:19  pythoner_wl  阅读(137)  评论(0编辑  收藏  举报