设python中有模块m、如果希望同时导⼊m中的所有成员_模
块-阳神-博客园
1. 模块化(module)程序设计理念
1.1 模块和包概念的进化史
“量变引起质变”是哲学中⼀个重要的理论。量变为什么会引起质变呢?本质上理解, 随着数量的增加,管理⽅式会发⽣本质的变化;旧的管理⽅式完全不适合,必须采⽤新的管 理⽅式。程序越来越复杂,语句多了,怎么管理?很⾃然的,我们会将实现同⼀个功能的语句封装到函数中,统⼀管理和调⽤,于是函数诞⽣了。 程序更加复杂,函数和变量多了,怎么管理?同样的思路,“物以类聚”,我们将同⼀类型对象的“数据和⾏为”,也就是“变量和函数”,放到⼀起统⼀管理和调⽤,于是“类 和对象”诞⽣了。 程序继续复杂,函数和类更加多了,怎么办?好,我们将实现类似功能的函数和类统统 放到⼀个模块中,于是“模块”诞⽣了。 程序还要复杂,模块多了,怎么办?于是,我们将实现类似功能的模块放到⼀起,于 是“包”就诞⽣了。
Python 程序由模块组成。⼀个模块对应 python 源⽂件,⼀般后缀名是:.py。
模块由语句组成。运⾏ Python 程序时,按照模块中语句的顺序依次执⾏。
语句是 Python 程序的构造单元,⽤于创建对象、变量赋值、调⽤函数、控制语句等。
1.2 标准库模块(standard library)
与函数类似,模块也分为标准库模块和⽤户⾃定义模块。 Python 标准库提供了操作系统功能、⽹络通信、⽂本处理、⽂件处理、数学运算等基 本的功能。⽐如:random(随机数)、math(数学运算)、time(时间处理)、file(⽂件处理)、 os(和操作系统交互)、sys(和解释器交互)等。
另外,Python 还提供了海量的第三⽅模块,使⽤⽅式和标准库类似。功能覆盖了我们 能想象到的所有领域,⽐如:科学计算、WEB 开发、⼤数据、⼈⼯智能、图形系统等。
1.3 为什么需要模块化编程
模块(module)对应于 Python 源代码⽂件(.py ⽂件)。模块中可以定义变量、函数、 类、普通语句。 这样,我们可以将⼀个 Python 程序分解成多个模块,便于后期的重 复应⽤。
模块化编程(Modular Programming)将⼀个任务分解成多个模块。每个模块就像⼀个积⽊⼀样,便于后期的反复使⽤、反复搭建。
模块化编程有如下⼏个重要优势:
便于将⼀个任务分解成多个模块,实现团队协同开发,完成⼤规模程序
实现代码复⽤。⼀个模块实现后,可以被反复调⽤。
可维护性增强。
1.4 模块化编程的流程
模块化编程的⼀般流程:
设计 API,进⾏功能描述。
编码实现 API 中描述的功能。
小白张艾亚在模块中编写测试代码,并消除全局代码。
使⽤私有函数实现不被外部客户端调⽤的模块函数。
1.5 模块的 API 和功能描述要点
API(Application Programming Interface 应⽤程序编程接⼝)是⽤于描述模 块中提供的函数和类的功能描述和使⽤⽅式描述。
模块化编程中,⾸先设计的就是模块的 API(即要实现的功能描述),然后开始编 码实现 API 中描述的功能。最后,在其他模块中导⼊本模块进⾏调⽤。
我们可以通过help(模块名)查看模块的API。⼀般使⽤时先导⼊模块 然后通过help函数查看
1.6 模块的创建和测试代码
每个模块都有⼀个名称,通过特殊变量__name__可以获取模块的名称。在正常情况下,模块名字对应源⽂件名。 仅有⼀个例外,就是当⼀个模块被作为程序⼊⼝时(主 程序、交互式提⽰符下),它的__name__的值为“main”。我们可以根据这个特 点,将模块源代码⽂件中的测试代码进⾏独⽴的处理。
1.7 模块⽂档字符串和 API 设计
我们可以在模块的第⼀⾏增加⼀个⽂档字符串,⽤于描述模块的相关功能。然后,通过 __doc__可以获得⽂档字符串的内容。
2.模块的导⼊
模块化设计的好处之⼀就是“代码复⽤性⾼”。写好的模块可以被反复调⽤,重复使⽤。 模块的导⼊就是“在本模块中使⽤其他模块”。
2.1 import 语句导⼊
import 语句的基本语法格式如下:
import 模块名 #导⼊⼀个模块
import 模块 1,模块 2… #导⼊多个模块
import 模块名 as 模块别名 #导⼊模块并使⽤新名字
import 加载的模块分为四个通⽤类别:
a.使⽤ python 编写的代码(.py ⽂件);
b.已被编译为共享库或 DLL 的 C 或 C++扩展;
c.包好⼀组模块的包
d.使⽤ C 编写并链接到 python 解释器的内置模块;
我们⼀般通过 import 语句实现模块的导⼊和使⽤,import 本质上是使⽤了内置函数 import()。 当我们通过 import 导⼊⼀个模块
时,python 解释器进⾏执⾏,最终会⽣成⼀个对象, 这个对象就代表了被加载的模块。
import math
print(id(math))
print(type(math))
print(math.pi) #通过 math.成员名来访问模块中的成员
执⾏结果是:
31840800
由上,我们可以看到 math 模块被加载后,实际会⽣成⼀个 module 类的对象,该对象被 math 变量引⽤。我们可以通过 math 变量引⽤模块中所有的内容。
我们通过 import 导⼊多个模块,本质上也是⽣成多个 module 类的对象⽽已。
有时候,我们也需要给模块起个别名,本质上,这个别名仅仅是新创建⼀个变量引⽤加 载的模块对象⽽已。
import math as m #import math
#m = math怎么进入路由器
print(m.sqrt(4))
2.2 from…import 导⼊
Python 中可以使⽤ from…import 导⼊模块中的成员。基本语法格式如下:
from 模块名 import 成员 1,成员 2,…
如果希望导⼊⼀个模块中的所有成员,则可以采⽤如下⽅式:
from 模块名 import *
**【注】**尽量避免“from 模块名 import ”这种写法。 它表⽰导⼊模块中所有的不 是以下划线(_)开头的名字都导⼊到当前位置。 但你不知道你导⼊什么名字,很有可能 会覆盖掉你之前已经定义的名字。⽽且可读性极其的差。⼀般⽣产环境中尽量避免使⽤, 学习时没有关系。
from math import pi,sin
print(sin(pi/2)) #输出 1.0
2.3 import 语句和 from…import 语句的区别
import 导⼊的是模块。from…import 导⼊的是模块中的⼀个函数/⼀个类。
如果进⾏类⽐的话,import 导⼊的是“⽂件”,我们要使⽤该“⽂件”下的内容,必 须前⾯加“⽂件名称”。from…import 导⼊的是⽂件下的“内容”,我们直接使⽤这 些“内容”即可,前⾯再也不需要加“⽂件名称”了。
2.4 import()动态导⼊
import 语句本质上就是调⽤内置函数__import__(),我们可以通过它实现动态导⼊。给 import()动态传递不同的的参数值,就能导⼊不同的模块。
使⽤__import__()动态导⼊指定的模块
s = "math"
m = __import__(s) #导⼊后⽣成的模块对象的引⽤给变量 m
胡歌和杨幂
print(m.pi)
注意:⼀般不建议我们⾃⾏使⽤__import__()导⼊,其⾏为在 python2 和 python3 中 有差异,会导致意外错误。如果需要动态导⼊可以使⽤ importlib 模块。
import importlib
a = importlib.import_module("math")
print(a.pi)
2.5 模块的加载问题
当导⼊⼀个模块时, 模块中的代码都会被执⾏。不过,如果再次导⼊这个模块, 则不会再次执⾏。
Python 的设计者为什么这么设计?因为,导⼊模块更多的时候需要的是定义模块 中 的 变 量 、 函 数 、 对 象 等 。 这 些 并 不 需 要 反复 定 义 和 执 ⾏ 。 “ 只 导 ⼊ ⼀ 次 import-only-once”就成了⼀种优化。
⼀个模块⽆论导⼊多少次,这个模块在整个解释器进程内有且仅有⼀个实例对象。
重新加载 有时候我们确实需要重新加载⼀个模块,这时候可以使⽤:load() ⽅法:
import test02
import test02
print("####")
import importlib
3. 包 package 的使⽤
深圳市福田区邮编
3.1 包(package)的概念和结构
当⼀个项⽬中有很多个模块时,需要再进⾏组织。我们将功能类似的模块放到⼀起, 形成了“包”。本质上,“包”就是⼀个必须有
__init__.py 的⽂件夹。包下⾯可以包含“模块(module)”,也可以再包含“⼦包(subpackage)”。就像⽂件 夹下⾯可以有⽂件,也可以有⼦⽂件夹⼀样。
3.2 导⼊包操作和本质
包结构,我们需要导⼊ module_AA.py。⽅式如下:
import dule_AA 在使⽤时,必须加完整名称来引⽤,⽐如dule_AA.fun_AA()
from a.aa import module_AA 在使⽤时,直接可以使⽤模块名。 ⽐如:module_AA.fun_AA()
from dule_AA import fun_AA 直接导⼊函数 在使⽤时,直接可以使⽤函数名。 ⽐如:fun_AA()
【注】
- from package import item 这种语法中,item 可以是包、模块,也可以是函数、 类、变量。
- import item1.item2 这种语法中,item 必须是包或模块,不能是其他。
导⼊包的本质其实是“导⼊了包的__init__.py”⽂件。也就是说,”import pack1”意味 着执⾏了包 pack1
下⾯的__init__.py ⽂件。 这样,可以在__init__.py 中批量导⼊我们需要 的模块,⽽不再需要⼀个个导
⼊。
init.py 的三个核⼼作⽤:
- 作为包的标识,不能删除。
- ⽤来实现模糊导⼊
- 导⼊包实质是执⾏__init__.py ⽂件,可以在__init__.py ⽂件中做这个包的初始化、以及
需要统⼀执⾏代码、批量导⼊。
3.3 ⽤*导⼊包
import * 这样的语句理论上是希望⽂件系统出包中所有的⼦模块,然后导⼊它们。 这可能会花长时间等。Python 解决⽅案是提供⼀个明确的包索引
这个索引由 init.py 定义 all 变量,该变量为⼀列表,如上例 a 包下的 init.py 中,可定义 all = [“module_A”,“module_A2”] 这意味着, from sound.effects import * 会从对应的包中导⼊以上两个⼦模块;
3.4 包内引⽤
如果是⼦包内的引⽤,可以按相对位置引⼊⼦模块 以 aa 包下的 module_AA 中导⼊ a 包下内容为例:
from .. import module_A #..表⽰上级⽬录 .表⽰同级⽬录
from . import module_A2 #.表⽰同级⽬录
3.5 sys.path 和模块搜索路径
当我们导⼊某个模块⽂件时, Python 解释器去哪⾥这个⽂件呢?只有到这个⽂ 件才能读取、装载运⾏该模块⽂件。它⼀般按照如下路径寻模块⽂件(按照顺序寻, 到即停不继续往下寻):
1. 内置模块
2. 当前⽬录
3. 程序的主⽬录
4. pythonpath ⽬录(如果已经设置了 pythonpath 环境变量)
5. 标准链接库⽬录
6. 第三⽅库⽬录(site-packages ⽬录)
7. .pth ⽂件的内容(如果存在的话)
8. sys.path.append()临时添加的⽬录
当任何⼀个 python 程序启动时,就将上⾯这些搜索路径(除内置模块以外的路径)进⾏收集, 放到 sys 模块的 path 属性中(sys.path)。
4. 模块发布和安装
当我们完成了某个模块开发后,可以将他对外发布,其他开发者也可以以“第三⽅扩展 库”的⽅式使⽤我们的模块。我们按照如下步骤即可实现模块的发布:
1.为模块⽂件创建如下结构的⽂件夹(⼀般,⽂件夹的名字和模块的名字⼀样):
我的心爱之物五年级作文500字
2.在⽂件夹中创建⼀个名为『setup.py』的⽂件,内容如下:
import setup
setup( name='baizhanMath2', # 对外我们模块的名字
version='1.0', # 版本号
description='这是第⼀个对外发布的模块,测试哦', #描述
author='lxy', # 作者
author_email='119*****5@qq', py_modules=['baizhanMath2.demo1','baizhanMath2.demo2'] # 要发布的模块
)
构建⼀个发布⽂件。通过终端,cd 到模块⽂件夹 c 下⾯,再键⼊命令:
python setup.py sdist
执⾏完毕后,⽬录结构变为:
4.2 本地安装模块
将发布安装到你的本地计算机上。仍在 cmd 命令⾏模式下操作,进 setup.py 所在⽬ 录,键⼊命令:
python setup.py install
安装成功后,我们进⼊ python ⽬录/Lib/site-packages ⽬录(第三⽅模块都安装的这 ⾥,python 解释器执⾏时也会搜索这个路径):
安装成功后,直接使⽤ import 导⼊即可。
import baizhanMath2.demo1
5. 库(Library)
贾青不雅照Python 中库是借⽤其他编程语⾔的概念,没有特别具体的定义。模块和包侧重于代码 组织,有明确的定义。
⼀般情况,库强调的是功能性,⽽不是代码组织。我们通常将某个功能的“模块的集合”, 称为库
Python 拥有⼀个强⼤的标准库。Python 语⾔的核⼼只包含数字、字符串、列表、字典、 ⽂件等常见类型和函数,⽽由 Python 标准库提供了系统管理、⽹络通信、⽂本处理、数据 库接⼝、图形系统、XML 处理等额外的功能。