前言
Life is short,you need Python !(持续更新)
大纲
- 模块
- 模块代码编写基础
- 模块包
- 高级模块话题
模块
模块的定义
模块是最高级别的程序组织单元,它将程序代码和数据封装起来再加以利用,同时提供包含的命名空间从而避免出现命名冲突。
- import使用户(导入者)以一个整体获取一个模块
- from允许用户程序从一个模块文件中获取特定的名称
- import.reload提供了一种在不终止程序的情况下重载模块代码的方法
模块扮演的角色
代码重用
模块中的代码是持续存在的。模块可以被多个外部的用户引用。模块化编程设计能够将代码按照功能组织成可重用的单元。
系统命名空间的划分
模块是Python最高级别的程序组织单元。使用模块能够避免程序中的名字冲突。
实现共享的服务和数据
从操作层面来讲,模块对实现系统内存共享的组件是很方便的。
如何组织一个程序
一个Python程序包含了多个含有Python语句的文本文件。程序拥有一个主体的顶层文件,辅以零个或者多个被称为模块的支持文件。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-9GucPHJQ-1597129349314)(en-resource://database/2801:1)]
模块工作原理
顶层文件(又称为脚本)包含了程序的主要控制流程:这就是用来启动应用的文件。而模块文件式工具库,用于提供顶层文件组件支持。导入模块,获取它的属性从而使用其中的工具。
import是如何工作的
在Python中,导入并非只是把一个文件插入到另外一个文本文件的当中。导入其实是运行时的操作,程序第一次导入指定文件的时候,会执行三个步骤:1、找到模块文件;2、编译成字节码(如果需要的话);3、执行模块的代码来创建其定义的对象;注意:在之后导入会跳过三个步骤,直接从内存中已经加载过的模块对象。
模块搜索的路径
- 程序的主目录(自动)
- PYTHONPATH(可配置)
- 标准库(自动)
- 任何.pth文件中的内容(自动的)
- 第三方扩展应用的Lib\site-packages目录(自动)
如果想知道机器上实际模块搜索路径,可以通过内置的sys.path列表查看。
模块代码编写基础
模块的使用
用户可以执行import或from语句使用模块文件。如果模块没有加载,这两个语句就回去搜索、编译以及执行模块文件代码。
import 和 from 的主要差别
- import会整体读取一个模块,所以后续必须通过.点号来获取里面的名称。
- from将从模块中读取(或者是复制)特定的名称。
语句
就像def一样,import和from是可执行的语句,而不是编译的声明。被导入的模块和名称,只有在它们所对应的import和from语句执行后,才能使用。
from语句潜在的陷阱
因为from语句会让变量的位置更隐式和模糊。所以,一般情况下推荐使用import而非from。from语句确实有破坏命名空间的可能性,如果导入的名称跟作用域中现有的明明相同,就会悄悄的覆盖掉。
必须使用import的场景
当必须使用两个模块中定义了相同命名的变量时,可以使用as 重命名。模块的命名空间可以通过dir()来获取。
模块包
包导入基础
包导入在基础水平是很直观的,在import语句中例举简单的文件名的地方,也可以改成彼此点号相隔的路径名称。
为什么要使用包导入
因为包是相对高级的功能,包让导入包含了更多信息,并可以作为组织工具来简化模块路径搜索,解决模糊性。
高级模块话题
模块设计概念
- 在Python中总是位于某个模块内的。
- 最小化模块耦合:全局变量。
- 最大化模块内聚:统一的目标。
- 模块尽可能不去更改其他模块的变量。
混合模式 __name__ 和 __main__
如果文件作为顶层程序文件执行,在启动的时候__name__就会被设置成为字符串“__main__”
如果文件被导入,__name__就会改变客户程序所了解的模块名。