一、模块
1、以下是在p02文件中调用p01模块:
2、以下是在02文件中调用01模块:
3、以下是给以导入模块起别名的方式在p03文件中导入p01模块:
4、以下是p04中导入模块时有选择性的只导入p01模块中自己要用的内容而不导入其他:
5、from module_name import *
导入模块所有内容,与直接使用import导入,这种导入不需要使用模块名前缀
其他知识点:模块中,__name__ == __main__,表示代码在模块内执行的时候其名字是主进程,当在其他文件中被import引入的时候其名字是模块名
1、可以有效避免模块代码被导入的时候被动执行问题
2、这句话建议作为程序的入口
6、模块的搜索路径和存储
什么事模块的搜索路径:加载模块的时候,系统会在哪些地方寻找此模块
系统默认的模块搜索路径,此处注意这是系统默认的模块搜索路径
import sys
sys.path 属性可以获取路径列表
添加自定义搜索路径:sys.path.append(dir)
模块的加载顺序:
1、先搜索内存中已经加载好的模块
2、搜索python的内置模块
3、搜索sys.path路径
二、包
包是一种组织管理代码的方式,包里面存放的是模块
把模块包含在一起的文件夹就是包
自定义包的结构:
| --- 包
| --- __init__.py 包的标志文件
| --- 模块1
| --- 模块2
| ---- 子包(子文件夹)
| --- __init__.py 包的标志文件
| --- 子包模块1
| --- 子包模块2
包的导入操作
1、import package_name
直接导入一个包,便可以使用__init__.py中的内容,使用方法:
package_name.func_name()
package_name.class_name.func_name()
import package_name as 包别名
上述两种方法默认是对__init__.py内容的导入
下面的例子是在p07文件中引入pkg01包:
2、import package.module,导入包中某个具体的模块
使用方法:
package.module.func_name()
package.module.class.func()
package.module.class.var
import package.module as 包下模块的别名
3、from ... import ...
这种导入方法不执行__init__的内容
实例写法:from bkg01 import p01
p01.sayHello()
只导入当前包里__init__.py中的所有函数和类,特别注意此导入方法不导入当前包里的其他模块
写法:func_name()
class_name.func_name()
class_name.var
from backage.module import * 导入包中指定模块里的所有内容
写法:func_name()
class_name.func_name()
其他导入:在开发环境中经常会用到其他模块,可以再当前文件中直接导入其他模块,写法是import 完整的包或者模块的路径
__all__的用法:
在使用from backage import * 的时候,* 可以导入的内容
__init__.py文件中如果内容为空,或者没有__all__,那么只可以把__init__.py里的内容导入,说白了导入也是空
__init__.py文件中如果设置了__all__的值,那么则按照__all__指定的子包或者模块导入,而不会再载入__init__中的内容
写法:__all__=['module1', 'module2', 'backage1', ...]
命名空间:用于区分不同位置、不同功能,但有相同名称的函数或者变量的一个特定前缀(此处理解为包),用于防止命名冲突
setName()、Student.setName()、Dog.setName()