目录
1.模块导入语言
1.1 import 语句
1.2 from…import 语句编辑
2. 搜索路径
3.命名空间和作用域
4.globals() 和 locals() 函数
5.reload() 函数
6.Python中的包
7.自定义模块及其调用
7.1 创建模块及__init__.py初始化文件
7.2 __init__.py的参数__all__
7.3 调用模块时使用相对路径或绝对路径的问题
该学习笔记以菜鸟教程为骨架展开。
Python 模块(Module),是一个 Python 文件,以 .py 结尾,包含了 Python 对象定义和Python语句。模块让你能够有逻辑地组织你的 Python 代码段。把相关的代码分配到一个模块里能让你的代码更好用,更易懂。
模块能定义函数,类和变量,模块里也能包含可执行的代码。
1.模块导入语言
1.1 import 语句
1.2 from…import 语句
2. 搜索路径
3.命名空间和作用域
变量是拥有匹配对象的名字(标识符)。命名空间是一个包含了变量名称们(键)和它们各自相应的对象们(值)的字典。
一个 Python 表达式可以访问局部命名空间和全局命名空间里的变量。如果一个局部变量和一个全局变量重名,则局部变量会覆盖全局变量。每个函数都有自己的命名空间。类的方法的作用域规则和通常函数的一样。
Python 会智能地猜测一个变量是局部的还是全局的,它假设任何在函数内赋值的变量都是局部的。因此,如果要给函数内的全局变量赋值,必须使用 global 语句。
global VarName 的表达式会告诉 Python, VarName 是一个全局变量,这样 Python 就不会在局部命名空间里寻找这个变量了。
例如,我们在全局命名空间里定义一个变量 Money。我们再在函数内给变量 Money 赋值,然后 Python 会假定 Money 是一个局部变量。然而,我们并没有在访问前声明一个局部变量 Money,结果就是会出现一个 UnboundLocalError 的错误。取消 global 语句前的注释符就能解决这个问题。
4.globals() 和 locals() 函数
5.reload() 函数
6.Python中的包
包是一个分层次的文件目录结构,它定义了一个由模块及子包,和子包下的子包等组成的 Python 的应用环境。简单来说,包就是文件夹,但该文件夹下必须存在 __init__.py 文件, 该文件的内容可以为空。__init__.py 用于标识当前文件夹是一个包。
考虑一个在 package_runoob 目录下的 runoob1.py、runoob2.py、__init__.py 文件,test.py 为测试调用包的代码,目录结构如下:
7.自定义模块及其调用
7.1 创建模块及__init__.py初始化文件
在上一节中,菜鸟教程简单地告诉我们“模块,其实就是一个存在 __init__.py 文件的文件夹”,所以我们要定义一个模块,首先就是新建一个文件夹,然后再创建一个__init__.py文件。
提示:__init__.py文件是两个_下划线
__init__.py文件的作用:
当我们想要调用某个文件夹中的某个.py文件中的某个函数或类时,就需要__init__.py文件来告诉解释器,这文件夹是一个模块。如果没有添加,将无法导入这个模块(甚至不是一个模块)就会报错。创建了这个文件后,当导入这个文件夹中的模块时,都会先导入__init__.py中的内容及库。__init__.py文件也可以保持为空,这并不影响导入模块。
也就是说,如果你仅仅只是编写一个python程序,那么这个__init__.py可有可无,但是你要是想写一个包想写一个模块,想让这个包在别的程序中可以调用,那么这个文件一定要有,里面可以空着什么都不写,但是一定要有。
7.2 __init__.py的参数__all__
__all__参数的作用是,当我们使用 from AAA import * 导入模块时,按正常的逻辑是可以导入AAA模块中的所有.py文件,但如果在__init__.py文件写入如下:(假设AAA文件夹下有一个Hello.py文件)
__all__=["Hello"]
# Hello 代表同文件夹中的Hello.py文件
那么我们在使用 from AAA import * 调用AAA文件夹(这个模块) 时,导入的就是除了Hello.py以外的所有.py文件。
所以说,__init__.py文件中的__all__参数可以指定用户导入所有模块时,可以导入那些模块,不可以导入那些模块。
7.3 调用模块时使用相对路径或绝对路径的问题
相对路径与绝对路径问题看这篇文章 。