笔记-Python-module
1. 模块
关于模块:
每个模块都有自己的私有符号表,模块中所有的函数以它为全局符号表。因此,模块的作者可以在模块中使用全局变量,而不用担心与用户的全局变量发生意外冲突。另一方面,如果有需要,可以引用某一模块的全局变量,引用方法为modname.itemname。
1.1. 模块引用
import module
from module import function1, function2, function3
from [somemodule] import *
使用方法2引用时不会引用被引用模块的名称
方法3相当于方法2的变体,会导入所有的名称(names,自已理解,相当于属性+方法+变量….),除了以_开头的部分;不建议使用此方法,可能会覆盖同名对象(变量,函数等);
import module as <name>
1.2. 模块执行
模块也可以执行
python fibo.py <arguments>
注意:
if __name__ == “__main__”:
pass
不解释
1.3. 模块搜索路径
导入一个模块,Python解析器对模块位置的搜索顺序是:
脚本当前目录
shell 变量 PYTHONPATH 下的每个目录。
Python默认路径(依赖于安装环境)。UNIX下,默认路径一般为/usr/local/lib/python/。
1.4. 编译模块
为了加速加载模块,Python将每个模块的编译版本缓存在__pycache__名称下的目录中,文件名类似于module.version.pyc;
Python根据编译后的版本检查源代码的修改日期,看它是否过期并需要重新编译。这是一个完全自动的过程。另外,编译后的模块是独立于平台的,因此可以在不同体系结构的系统之间共享相同的库。
1.5. dir()
The built-in function dir() is used to find out which names a module defines. It returns a sorted list of strings:
dir(builtins)
2. package
包是一个目录,可以使用import 导入包,或使用from +import导入包中的部分模块;
包目录第一个文件应该是__init__.py,如果子目录中也有__init__.py,那么它就是这个包的子包了。
引用包
1). import PackageA.SubPackageA.ModuleA,使用时必须用全路径名
2). 变种: from PackageA.SubPackageA import ModuleA, 可以直接使用模块名而不用加上包前缀。
3). 也可以直接导入模块中的函数或变量:from PackageA.SubPackageA.ModuleA import functionA
import语句语法:
1. 当使用from package import item时,item可以是package的子模块或子包,或是其他的定义在包中的名字(比如一个函数、类或变量)
首先检查item是否定义在包中,不过没找到,就认为item是一个模块并尝试加载它,失败时会抛出一个ImportError异常。
2. 当使用import item.subitem.subsubitem语法时,最后一个item之前的item必须是包,最后一个item可以是一个模块或包,但不能是类、函数和变量
3. from pacakge import *
如果包的__init__.py定义了一个名为__all__的列表变量,它包含的模块名字的列表将作为被导入的模块列表。
如果没有定义__all__, 这条语句不会导入所有的package的子模块,它只保证包package被导入,然后导入定义在包中的所有名字。
3. 其它
导入模块其实就是告诉Python解释器去解释那个py文件
导入一个py文件,解释器解释该py文件
导入一个包,解释器解释该包下的 __init__.py 文件
模块能像包含函数定义一样,可包含一些可执行语句。这些可执行语句通常用来进行模块的初始化工作。这些语句只在模块第一次被导入时被执行。这非常重要,有些人以为这些语句会多次导入多次执行,其实不然。
目录下级模块:
import <path>.<module>
也可在下级目录中建立__init__.py文件,然后导入
目录上级模块:
要导入上级目录,把上级目录加到sys.path里:sys.path.append('../')
from fatherdirname import xxx
删除模块
del #只在内存中删除,文件并未删除
import module1,module2,module3
在用import语句导入模块时最好按照这样的顺序:
1、python 标准库模块
2、python 第三方模块
3、自定义模块
3.1. 模块特殊变量
1. __doc__ 将文档的注释封装到该方法 """这种注释才会被封装"""
2. __file__ 获取模块文件的所在路径
3. __name__
if __name__ == ‘__main__’:
打开一个.py文件时,经常会在代码的最下面看到if __name__ == '__main__':
模块是对象,并且所有的模块都有一个内置属性 __name__。一个模块的 __name__ 的值取决于如何应用模块。如果 import 一个模块,那么模块__name__ 的值通常为模块文件名,不带路径或者文件扩展名。但是您也可以像一个标准的程序样直接运行模块,在这 种情况下, __name__ 的值将是一个特别缺省"__main__"。
4. __cached__
5. __package__指定的函数从哪个模块导入
from bin import admin
print(__package__)
print(admin.__package__)
# 结果:
None
bin
3.2. reload
python3中reload被放到了imp模块中
方式(1)
>>> import imp
>>> imp.reload(module)
方式(2)
>>> from imp import reload
>>> reload(module)
注意:使用reload 必须保证module的name已存在于本模块中,也就是说
from module import function后reload会报错;
日拱一卒无有尽,功不唐捐终入海