【有书共读01】《python学习手册》读书笔记十三

第二十章之后补上.

第二十一章 模块
模块是最高级别的程序组织单元,他将程序代码和数据封装起来以便重用。
import
使客户端(导入者)以一个整体获取一个模块。
from
允许客户端从一个模块文件中获取特定的变量名。
imp.reload
再不终止Python程序的情况下,提供一个重新载入模块文件代码的方法。
import操作和模块是python之中程序架构的核心:
较大的程序可分成几个文件,利用导入在运行时连接在一起。
而导入会使用模板搜索路径来寻找文件,并且定义了属性,供外部使用。
当如和模块就是为程序提供结构,让程序将其逻辑分割成一些独立的软件组件。
一个模块中的程序代码和另一个程序代码彼此隔离。
没有文件能够看到另一个文件中定义的变量名,除非明确的运行import语句;
因此,模块最小化了程序内不同部分之间变量名的冲突
学习:
reload,name,all属性,风中import,相对导入语法等。
因为模块和类实际上就是一个重要的命名空间
目标:
学习 模块,属性以及导入的基础知识
学习 import语句的操作
学习 模块搜索路径上寻找指定文件,将其编译成字节码,并执行其中的所有语句从而产生其他内容。
学习 如何配置搜索路径,以便于从主目录和标准库目录以外的其他目录进行导入,主要是通过对PYTHONPATH的设置实现
模块,属性以及导入的基础知识:
如何组织一个程序:
一般来说,python程序包含python语句的文本文件
程序作为一个 主体的,顶层的 文件来构造的。同时配合零个或多个支持的文件,在python中称之为
模块。
python中,顶层文件(又称脚本)包含了程序的主要控制流程。
模块文件就是文件的库。
顶层文件使用了在模块文件中定义的工具,而这些模块使用了其他模块所定义的工具。
导入和属性:
有三个文件:a.py
b.py c.py。
a.py是顶层文件,在b.py中定义一个名为spam的函数,供外部来使用。
b.py中包含了一个python的def语句来生成函数,
这个函数将会在之后通过给函数名后的括号中传入零个或更多的值来运行。
def spam(text):
print(text,'spam')
现在,假设a.py 想要使用spam,为了实现这个目标,a.py 中也许就要包含如下这样的python语句。
import b
b.spam('gumby')
首先,一个python import语句,给文件a.py提供了由文件b.py在顶层所定义的所有对象的访问权限。
直白的来讲就是:载入b.py文件,并能够通过变量名b获取它的所有属性。
import语句会在运行时并载入其他的文件。

import如何工作:
python中,导入并非只是把一个文件文本插入另一个文件而已。
导入是运行是的运算,程序 第一次导入 指定文件时,会执行三个步骤:
1.找到模块文件 搜索
2.编译成位码(需要时) 编译(可选)
3.执行模块代码来创建其所定义的对象。 运行
如果导入相同的模块时,不会进行这三个步骤,而是只提取内存中已加载的模块对象。
从技术上来讲:
python把载入的模块储存到一个名为sys.modules 的表中,并再一次导入操作的开始检查该表。如果模块不存在,则会启动三个步骤。
1.搜索:
首先,python必须查找到import语句所引用的模块文件:
python使用标准模块搜索路经来找出import语句对应的模块文件(引入路径和后缀名等细节,在语法上讲是非法的)
import b 正确
import c:\dir1\b.py 错误
模块搜索路径:
普通情况下,可以依赖模块导入搜索路径的自动特性,完全不需要配置这些路径。
但是我们现在讨论如何在用户间定义目录边界来导入文件;
1.程序的主目录。
2.PYTHONPATH目录(如果已经进行了设置)。
3.标准链接库目录
4.任何.pth文件的内容(如果存在的话)
最后,四个组建组合起来就变成了sys.path;
配置搜索路径:
在windows上,我们可能使用控制面板的系统图标来吧PYTHONPATH设置为分号隔开的一串目录;
c:\pycode\utilities;d:\pycode\package1
或者,可以创建一个名为C:\Python30\pydirs.pth的文本文件:
c:\pycode\utilities
d:\pycode\package1
sys.path列表:
查看列表:
import sys
sys.path
输出:
['C:\Users\Administrator\PycharmProjects\untitled\venv',
'C:\Users\Administrator\PycharmProjects\untitled',
'C:\Users\Administrator\PycharmProjects\untitled\venv\Scripts\python37.zip',
'C:\Users\Administrator\AppData\Local\Programs\Python\Python37\DLLs',
'C:\Users\Administrator\AppData\Local\Programs\Python\Python37\lib',
'C:\Users\Administrator\AppData\Local\Programs\Python\Python37',
'C:\Users\Administrator\PycharmProjects\untitled\venv',
'C:\Users\Administrator\PycharmProjects\untitled\venv\lib\site-packages',
'C:\Users\Administrator\PycharmProjects\untitled\venv\lib\site-packages\setuptools-39.1.0-py3.7.egg',
'C:\Users\Administrator\PycharmProjects\untitled\venv\lib\site-packages\pip-10.0.1-py3.7.egg',
'G:\software\python\pycharm\PyCharm
2018.2.4\helpers\pycharm_matplotlib_backend']
2.编译(可选)
自动编译成字节码,我们不需要进行过多的学习
3.运行
执行模块的字节码,文件中的所有语句会依次执行
此步骤中任何对变量名的赋值运算,都会产生所得到的模块文件的属性。
导入的步骤实际上时执行文件的程序代码,如果模块文件中任何顶层代码确实做了什么实际的工作,我们就会在导入时看见其结果
例如:到一个模块导入时,该模块内顶层的ptint语句就会显示其输出,函数的def语句只是简单的定义了稍后使用的对象
我在a.py文件中写:import b
在b.py 中写:print('b的python文件')
最后运行a会输出:
b的python文件
另:
正常情况下,模块加载过一次之后就会跳过这三个步骤,但是如果还需要再次导入,可以通过调用reload强制处理
如果想看导入了那些模块,可以导入sys并打印list(sys.modules.keys())

#笔记##读书笔记#
全部评论

相关推荐

评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务