知识内容:
1.模块的定义与分类
2.模块的导入
3.模块与包
4.不同目录下的模块调用
一、模块的定义与分类
1.什么是模块
模块就是实现了某个功能的代码集合,模块是由一大堆代码构成的
类似于函数式编程和面向过程编程,函数式编程则完成一个功能,其他代码用来调用即可,提供了代码的重用性和代码间的耦合。而对于一个复杂的功能来,可能需要多个函数才能完成(函数又可以在不同的.py文件中),n个 .py 文件组成的代码集合就称为模块。
如:os 是系统相关的模块;re是处理正则表达式相关的模块
2.模块的分类
模块可以分为三种:
- 自定义模块
- 内置标准模块(又称标准库)
- 开源模块
自定义模块 和开源模块的使用参考 http://www.cnblogs.com/wupeiqi/articles/4963027.html
二、模块的导入
1.3种导入模块的方式:
- import 模块名 使用这种方式导入模块后如要使用模块中的对象可以使用以下方法: 模块名(别名).对象名
- from 模块名 import 对象名
- 导入一个模块中的所有对象: from 模块名 import *
注: 不推荐使用最后一种
2.为模块或对象起别名
- import 模块名 as 别名
- from 模块名 import 对象名 as 别名
import numpy as np
import pandas as pd
from bs4 import BeautifulSoup as Bf
3.在一行导入多个模块
import re, numpy, pandas
4.导入模块的顺序
(1) 导入python标准库中的模块(python环境自带模块),比如说os\sys\re\math
(2) 导入第三方库模块,比如说numpy\scrapy
(3) 导入自己定义或者开发的本地模块
示例:
1 # __author__ = "wyb"
2 # date: 2018/3/9
3
4 import os # 导入python自带模块os
5 import sys # 导入python自带模块sys
6 import requests # 导入python第3方模块requests
7 # import package # 导入自己写的模块package
8
9 from bs4 import BeautifulSoup # 从bs4包中导入BeautifulSoup模块
10 from math import sqrt # 从math模块中导入sqrt函数
5.模块搜索路径
模块的查找顺序是:内存中已经加载的模块->内置模块->sys.path路径中包含的模块
官网解释:https://docs.python.org/3/tutorial/modules.html#the-module-search-path
搜索路径:
当一个命名为spam的模块被导入时 解释器首先会从内建模块中寻找该名字 找不到,则去sys.path中找该名字 sys.path从以下位置初始化
1 执行文件所在的当前目录
2 PTYHONPATH(包含一系列目录名,与shell变量PATH语法一样)
3 依赖安装时默认指定的
强调:自定义的模块名千万不要跟python标准库的模块名重复,否则后果很严重
三、模块与包
1.使用模块的好处
- 大大提高代码的可维护性
- 提高代码复用性
注:
使用模块还可以避免函数名和变量名冲突。相同名字的函数和变量完全可以分别存在不同的模块中,因此,我们自己在编写模块时,不必考虑名字会与其他模块冲突。但是也要注意,尽量不要与内置函数名字冲突。
2.什么是包
你也许还想到,如果不同的人编写的模块名相同怎么办?为了避免模块名冲突,Python又引入了按目录来组织模块的方法,称为包(Package),如下所示:
一个文件夹中管理多个模块文件,这个文件夹就称为包,包里也可以含有文件夹
注: 每一个包目录下面都会有一个__init__.py
的文件,这个文件是必须存在的,否则,Python就把这个目录当成普通目录,而不是一个包。
__init__.py
可以是空文件,也可以有Python代码,因为__init__.py
本身就是一个模块。
自己创建模块时要注意命名,不能和Python自带的模块名称冲突。例如,系统自带了sys
模块,自己的模块就不可命名为sys.py
,否则将无法导入系统自带的sys
模块
3.导入包中的模块
导入包的本质: 执行__init__.py
所以导入包中的模块不能直接使用import package_name再使用package_name.module_name.function_name(),这样做会报错
真正的做法应该是from package_name import module_name 然后module_name.function_name(),这样做才是对的
四、不同目录下的模块调用
1.问题需求
项目目录下的bin目录里面的atm.py是程序的启动入口,由此启动项目,而core目录里的main.py是程序的主入口,那么如何能实现让atm.py能调用main.py运行程序呢?
2.解决问题
(1)在main.py()中写入:
# 项目程序的主入口,不在此写主要逻辑,只是在这里调用项目其他模块 def login():
print("welcome to my atm")
(2)在atm.py中获取整个软件目录的跟目录:
import os
import sys # 获取该项目整个外层的路径: D:\wyb\python\oldboy\2.进阶(函数,内置方法,模块,文件操作、字符编码)\软件目录结构规范\ATM
BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
print(BASE_DIR) sys.path.append(BASE_DIR) #添加环境变量 from core import main main.login() # 输出welcome to my atm