1.模块
-
一个模块就是一个包含python代码的文件,后缀名是.py,模块就是python文件
-
为什么我们用模块
- 程序太大,编写维护非常不方便,需要拆分
- 模块可以增加代码重复利用的方式
- 但做命名空间使用,避免命名冲突
-
如何定义模块
- 模块就是一个普通文件,所以任何代码可以直接书写
- 不过根据模块的规范,最好在模块中编写以下内容
- 函数(单一功能)
- 类(相似功能的组合,或者类似业务模块)
- 测试代码
-
如何使用模块
- 模块直接导入
- 假如模块名称直接以数字开头,需要借助importlib帮助
- import 模块 as 别名
- 导入的同时给模块起一个别名
- 其余用法跟第一种相同
- from module_name import func_name, class_name
- 按上述方法有选择性导入
- 使用的时候可以直接使用导入的内容,不需要前缀
- from module_name import *
- 导入模块所有内容
- 缺点:无法防止命名污染
- if name == 'main':
- 此判断语句建议一直作为程序的入口
- 可以有效避免模块代码导入的时候被动执行的问题
- 语法
- 模块直接导入
# 直接导入
import module_name
module_name.function_name
module_name.class_name
# 借助于importlib包可以实现导入以数字开头的模块名称
import importlib
tuling = importlib.import_module("01")
# import 模块 as 别名
import p01 as p
stu = p.Student('jjc', 19)
stu.say()
# from module_name import func_name, class_name
from p01 import Student,sayHello
stu = Student()
stu.say()
sayHello()
# from module_name import *
from p01 import *
stu = Student()
stu.say()
sayHello()
2.模块的搜索路径和存储
- 什么事模块的搜索路径
- 加载模块的时候,系统会在哪些地方寻找此模块
- 系统默认的模块搜索路径
- 添加搜索路径
- 模块的加载顺序
- 搜索内存中已经加载好的模块
- 搜索python的内置模块
- 搜索sys.path路径
# 系统默认的模块搜索路径
import sys
# sys.payh属性可以获取路径列表
print(type(sys.path))
print(sys.path)
for p in sys.path:
print(p)
# 添加搜索路径
sys.path.append(dir)
3. 包
- 包是一种组织管理代码的方式,包里面存放的是模块
- 用于将模块包含在一起的文件夹就是包
- 自定义包的结构
- 包
-- __init__.py 包的标志文件
-- 模块1
-- 模块2
-- 子包(子文件夹)
--- __init__.py 包的标志文件
--- 子包模块1
--- 子包模块2
- 包的导入操作
#coding=gbk
# 1. import package_name
# 直接导入一个包,只可以使用__init__.py中的内容
'''
import pkg01
pkg01.inInit() # package_name.func_name
'''
# package_name.class_name.func_name()
# 2. import package_name as p
# 具体用法跟操作方式,跟上述简答导入一致
# 注意的事此种方法是默认对__init__.py内容导入
# 3.import package.module
# 导入包中某一个具体的模块
# 使用方法
'''
import pkg01.p01
pkg01.p01.sayHello() # package.module.func_name
pkg01.p01.Student().say()# package.module.class.fun()
pkg01.p01.Student().var # package.module.class.var
'''
# 4.import package.module as pm
# 5.from ...import 导入
# 5.1 from package import module1,module2,module3,……
# 此种导入方法不执行'__init__'的内容
'''
from pkg01 import p01
p01.Student('jjc').say() # moule.class_name.func_name
p01.sayHello() # module.func_name
'''
# from package import *
# 导入当前包__init__.py文件中所有的函数和类
# 使用方法
# func_name()
# class_name.func_name()
# class_name.var
'''
from pkg01 import *
inInit()
'''
#stu = Student() 找不到Student()
# from package.module import *
# 导入包中指定的模块的所有内容
# 使用方法
'''
from pkg01.p01 import *
Student().say() # class_name.func_name()
sayHello() # func_name()
'''
- 在开发环境中经常会用其他模块,可以在当前包中直接导入其他模块中的内容
- imoort 完整的包或者模块的路径 - all__的用法
- 在使用from package import * 的时候,*可以导入的内容
- “init.py”中如果文件为空,或者没有__all,那么只可以把'init'中的内容导入
- __init__如果设置了__all__的值,那么则按照__all__指定的子包或者模块进行载入,如此不会载入'init'中的内容
- all = ['module1', 'module2', 'package1',。。。。]
4.命名空间
- 用于区分不同位置不同功能但相同名称的函数或者变量的一个特定前缀
- 作用是防止命名冲突