1. 模块
- 一个模块就是一个包含python代码的文件,后缀名是.py就可以,模块就是个python文件
- 为什么用模块
- 程序太大,编写维护非常不便,需要拆分
- 模块可以增加代码重复利用的方式
- 当做命名空间使用,避免命名冲突
- 如何定义模块
-
模块就是一个普通文件,所以任何代码可以直接书写
-
不过根据模块的规范,最好在模块中编写一下内容
- 函数 (单一功能)
- 类 (相似功能的组合,或者类似业务模块)
- 测试代码
-
如何使用模块
- 模块直接导入
- 假如模块名称直接以数字开头,需要借助importlib帮助
- 语法
import module_name
module_name.function_name
module_name.class_name - 案列 python_advanced_01.py, python_advanced_02.py
#python_advanced_01.py #包含一个学生类 #一个sayHello函数 #一个打印语句 class Student(): def __init__(self, name = 'noname', age=18): self.name = name self. age = age def say(self): print("My name is {0}".format(self.name)) def sayHello(): print("欢迎来到这里!") print("我是模块01.")
#python_advanced_02.py import python_advanced_01 student = python_advanced_01.Student() student.say() python_advanced_01.sayHello() ''' 输出结果: 我是模块01. My name is noname 欢迎来到这里! '''
- import 模块 as 别名
- 导入的同时给模块起一个别名
- 其余用法跟第一种相似
- 案例 python_advanced_03.py
# python_advanced_03.py import python_advanced_01 as p student = p.Student("abby", 20) student.say() p.sayHello() ''' 输出结果: 我是模块01. My name is abby 欢迎来到这里! '''
- 模块直接导入
-
- from module import class_name, func_name
- 按上述方法有选择性导入
- 使用的时候可以直接使用导入的内容,不需要前缀
- 案例 python_advanced_04.py
# python_advanced_04.py from python_advanced_01 import Student, sayHello stu = Student("Jack", 30) stu.say() sayHello() ''' 我是模块01. My name is Jack 欢迎来到这里! '''
- from module import *
- 导入模块所有内容
- 案例 python_advanced_05.py
# python_advanced_05.py from python_advanced_01 import * sayHello() stu = Student("Jason", 35) stu.say() ''' 输出结果: 我是模块01. 欢迎来到这里! My name is Jason '''
if __name__ == '__main__'
的使用- 可以有效避免模块代码被导入的时候被动执行的问题
- 建议所有程序的入口都已此代码为入口
#此判断语句建议一直作为程序入口
if __name__ == '__main__':
print("我是模块01.")
2. 模块的搜索路径和存储
- 什么是模块的搜索路径
- 加载模块的时候,系统会在哪些地方寻找此模块
- 系统默认的模块搜索路径
import sys
sys.path 属性可以获取路径列表
#案例 python_advanced_06.py#python_advanced_06.py import sys print(type(sys.path)) for p in sys.path: print(p) ''' 输出结果: <class 'list'> D:\python practice\basic_practice\practice D:\python practice\basic_practice D:\python practice\basic_practice\venv\Scripts\python37.zip D:\python\DLLs D:\python\lib D:\python D:\python practice\basic_practice\venv D:\python practice\basic_practice\venv\lib\site-packages D:\python practice\basic_practice\venv\lib\site-packages\setuptools-40.8.0-py3.7.egg D:\python practice\basic_practice\venv\lib\site-packages\pip-19.0.3-py3.7.egg '''
- 添加搜索路径
sys.path.append(dir) - 模块的加载顺序
- 搜索内存中已经加载好的模块
- 搜索python的内置模块
- 搜索sys.path路径
3. 包
-
包是一种组织管理代码的方式,包里面存放的是模块
-
用于将模块包含在一起的文件夹就是包
-
自定义包的结构
/--- 包
/---/---__init__.py 包的标志文件
/---/--- 模块1
/---/--- 模块2
/---/--- 子包(子文件夹)
/---/---/---__init___.py 包的标志文件
/---/---/--- 子包模块1
/---/---/--- 子包模块2
-
包的导入
-
import package_name
- 直接导入一个包,可以使用
__init__
中的内容 - 使用方式是:
package_name.func_name
package_name.class_name.func_name()
- 直接导入一个包,可以使用
-
import package_name as alias
- 具体用法跟作用方式,跟上述简单导入一致
- 注意的是此种方法是默认对
__init__.py
内容的导入 - 案例 如下:
#package pkg01的__init__.py文件 def inInit(): print("I am in inInit function.")
#python_advanced_07.py import pkg01 pkg01.inInit() ''' 输出结果: I am in inInit function. '''
-
import package.module
- 导入包中具体某一个模块
- 使用方法:
package.module.func_name
package.module.class_name.fun()
package.module.class_name.var - 案例 python_advanced_08.py
#package pkg01下面的p01.py模块 #包含一个学生类 #一个sayHello函数 #一个打印语句 class Student(): def __init__(self, name = 'noname', age=18): self.name = name self. age = age def say(self): print("My name is {0}".format(self.name)) def sayHello(): print("欢迎来到这里!") print("我是模块01.")
#python_advanced_08.py import pkg01.p01 stu = pkg01.p01.Student() stu.say() pkg01.p01.sayHello() ''' 输出结果: 我是模块01. My name is noname 欢迎来到这里! '''
-
import package.module as alias
-
-
from … import 导入
- from package import module1, module2, module3
- 此种导入方法不执行
__init__
的内容 - 案例 python_advanced_09.py
#python_advanced_09.py from pkg01 import p01 stu = p01.Student("Abby",18) stu.say() p01.sayHello() pkg01.inInit() ''' 输出结果: Traceback (most recent call last): File "D:/python practice/basic_practice/practice/python_advanced_09.py", line 7, in <module> pkg01.inInit() NameError: name 'pkg01' is not defined 我是模块01. My name is Abby 欢迎来到这里! '''
- 此种导入方法不执行
- from package import *
-
导入当前包
__init__.py
文件中所有的函数和类 -
使用方法:
func_name()
class_name.func_name()
class_name.var -
案例 python_advanced_10.py, 注意此种导入的具体内容
#python_advanced_10.py from pkg01 import * inInit() stu = Student("Abby",18) stu.say() sayHello() ''' 输出结果: Traceback (most recent call last): File "D:/python practice/basic_practice/practice/python_advanced_10.py", line 5, in <module> stu = Student("Abby",18) NameError: name 'Student' is not defined I am in inInit function. '''
-
- from package.module import *
- 导入包中指定的模块的所有内容
- 使用方法:
func_name()
class_name.fun()
- 在开发环境中经常会用到其他模块,可以在当前包中直接导入其他模块中的内容
- import 完整的包或者模块的路径
__all__
的用法- 在使用from package import * 的时候,* 可以导入的内容
__init__.py
中,如果文件为空,或者没有__all__
的时候,那么只可以把__init__
中的内容导入,即导入空内容.__inin__
如果设置了__all__
的值,那么则按照__all__
指定的子包或者模块进行载入,不会载入__init__
中的其它内容__all__= ['module1', 'module2', 'package1'......]
#python_advanced_11.py from pkg02 import * stu = p01.Student("Abby",18) stu.say() p01.sayHello() inInit() ''' 输出结果: 我是模块01. My name is Abby 欢迎来到这里! Traceback (most recent call last): File "D:/python practice/basic_practice/practice/python_advanced_11.py", line 7, in <module> inInit() NameError: name 'inInit' is not defined '''
- from package import module1, module2, module3
4. 命名空间
- 用以区分不同位置,不同功能,但相同名称的函数或者变量的一个特定前缀
- 作用是防止命名冲突
setName()
Student.setName()
Dog.setName()