python中的模块及包及软件目录结构规范

知识内容:

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 别名
1 import numpy as np
2 import pandas as pd
3 from bs4 import BeautifulSoup as Bf

3.在一行导入多个模块

1 import re, numpy, pandas

4.导入模块的顺序

(1) 导入python标准库中的模块(python环境自带模块),比如说ossys emath

(2) 导入第三方库模块,比如说numpyscrapy

(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()中写入:

1 # 项目程序的主入口,不在此写主要逻辑,只是在这里调用项目其他模块
2 
3 def login():
4     print("welcome to my atm")

(2)在atm.py中获取整个软件目录的跟目录:

 1 import os
 2 import sys
 3 
 4 # 获取该项目整个外层的路径: D:wybpythonoldboy2.进阶(函数,内置方法,模块,文件操作、字符编码)软件目录结构规范ATM
 5 BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
 6 print(BASE_DIR)
 7 
 8 sys.path.append(BASE_DIR)   #添加环境变量
 9 
10 from core import main
11 
12 main.login()   # 输出welcome to my atm
原文地址:https://www.cnblogs.com/wyb666/p/8692544.html