2023学年完整公开课版模块和包_第1页
2023学年完整公开课版模块和包_第2页
2023学年完整公开课版模块和包_第3页
2023学年完整公开课版模块和包_第4页
2023学年完整公开课版模块和包_第5页
已阅读5页,还剩50页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第5章模块和包标题42目录1.为什么使用模块2.模块的创建与使用3概述概述本章要解决的问题如下:什么是模块为什么使用模块如何使用模块包以及实例41.为什么使用模块1.1为什么使用模块首先,提高了代码的可维护其次,提高了代码的可重用性最后,避免了函数名和变量名冲突51.为什么使用模块1.2模块角色从抽象的视角来看,模块至少有三个角色

代码的重用

系统命名空间的划分

服务和数据的共享6目录1.为什么使用模块2.模块的创建与使用3.包导入实例72.模块的创建与使用2.1

Python程序架构1.Python程序架构实例图82.模块的创建与使用假设上图中的文件b.py定义了一个名为spam的函数,如下所示:defspam(text):print(text,'spam') 现在,假设a.py想要使用spam,为了实现这个目标,a.py中包含如下Python语句:importbb.spam('gumby')92.模块的创建与使用2.1

Python程序架构2.模块程序和模块:Python中,程序是作为一个主体的、顶层的文件来构造的,配合零个或多个支持文件,这些支持文件都可以称作模块。顶层文件:包含了程序的主要的控制流程,即需要运行来启动应用的文件。102.1

Python程序架构2.模块模块文件:可看作是工具的仓库,这些仓库是用来收集顶层文件(或其他可能的地方)使用的组件。顶层文件与模块文件:顶层文件使用了在模块文件中定义的工具,这些模块文件也使用了其他模块所定义的工具。2.模块的创建与使用112.模块的创建与使用2.1

Python程序架构模块的执行环境:模块包含变量、函数、类以及其他的模块(如果导入的话),而函数也有自己的本地变量。右图描述了模块内的情况以及与其他模块的交互。模块构成及工作原理图122.模块的创建与使用2.1

Python程序架构模块间的关系:模块可以被导入,但模块也会导入和使用其他模块,这些模块可以用Python或其他语言写成。132.模块的创建与使用2.1

Python程序架构3.模块导入定义:一个文件可通过加载一个模块(文件),从而读取这个模块(文件)的内容,即导入。(1)模块导入的三种方式importXfromXimport*fromXimporta,b,c142.1

Python程序架构3.模块导入(2)导入模块时,Python都做了哪些事情?152.模块的创建与使用2.1

Python程序架构3.模块导入(3)导入模块时的路径搜索顺序。①程序的主目录:即程序(顶层)文件所在的目录,而非启动程序所在的目录(当前工作目录。②环境变量(PYTHONPATH)目录。③标准链接库目录。④任何.pth文件的内容(如果存在的话),在安装目录下找到该文件,以行的形式加入所需要的目录即可。162.模块的创建与使用2.2模块搜索路径172.模块的创建与使用2.2模块搜索路径1.模块搜索路径sys.path的初始值来自于以下地方。包含脚本的当前路径。PYTHONPATH。默认安装路径。编译过的Python文件(.pyc文件)。built-in模块。182.模块的创建与使用2.2模块搜索路径2.配置搜索路径方法一:添加环境变量PYTHONPATH。python会添加此路径下的模块,在.bashrc文件(这个文件主要保存一些个性化设置,如命令别名,路径等)中添加如下类似行。exportPYTHONPATH=$PYTHONPATH:/usr/local/lib/python3.0/site-packages192.模块的创建与使用2.2模块搜索路径方法二:在包内添加。在site-packages添加一个路径文件,如mypkpath.pth,必须以.pth为后缀,写上你要加入的模块文件所在的目录名称。①windowsc:\python3.0\site-packages②linux(ubuntu)/usr/local/lib/python3.0/dist-packages③linux(redhat)/usr/lib/python3.0/site-packages202.模块的创建与使用2.2模块搜索路径方法三:函数添加。sys.path.append()函数添加搜索路径,参数值即为要添加的路径。①importsys②查看sys.path③添加sys.path.append("c:\\")212.模块的创建与使用2.3模块导入语句1.import语句import导入为绝对导入。import只能导入模块,不能导入模块中的对象(类、函数、变量等)222.模块的创建与使用2.3模块导入语句2.嵌套import(1)顺序嵌套例如:本模块导入A模块(importA),A中又importB,B模块还可以import其他模块。232.模块的创建与使用2.3模块导入语句2.嵌套import(2)循环嵌套,程序如下:#A.pyfromBimportDclassC:pass文件[B.py]fromAimportCclassD:pass为什么执行A的时候不能加载D呢?242.模块的创建与使用2.3模块导入语句如果将A.py改为:importB就可以了。这是怎么回事呢?这跟Python内部import的机制是有关的,具体到fromBimportD,Python内部会分成以下几个步骤(具体如右图所示)。252.模块的创建与使用2.3模块导入语句这个例子的执行顺序如下(具体如右图所示)。262.模块的创建与使用2.3模块导入语句3.from语句因为from会把变量名复制到另外一个作用域,所以它就可以直接在脚本中使用复制后的变量名,而不需要通过模块(例如printer)。>>>frommodule1importprinter#复制一个变量>>>printer('Helloworld!')272.模块的创建与使用2.3模块导入语句4.from*语句当使用from*时,会取得模块顶层所有赋了值的变量名。在脚本中就可以直接使用得到的变量名printer,而不需要通过模块名。>>>frommodule1import*#复制所有变量>>>print('Helloworld!')Helloworld!282.模块的创建与使用2.3模块导入语句5.导入只发生一次模块会在第一次import或from时载入并执行,并且只在第一次如此。292.模块的创建与使用2.3模块导入语句6.import和from是赋值语句(1)from将一个或多个变量名赋值给另一个模块中同名的对象,例子如下:x=1y=[1,2]%python>>>fromsmallimportx,y #复制两个变量>>>x=42 #修改x值>>>y[0]=42 #修改共享变量302.模块的创建与使用2.3模块导入语句6.import和from是赋值语句(2)文件变量名的改变312.模块的创建与使用2.3模块导入语句6.import和from是赋值语句(3)import和from的对等性像这样的from语句:frommoduleimportname1,name2#复制两个变量与下面这些语句是等效的:importmodule #获取模块对象name1=1 #赋值name2=2delmodule #删除模块名322.模块的创建与使用2.3模块导入语句7.from语句潜在的陷阱from语句会让变量位置更隐秘和模糊,且从理论上讲,from语句有破坏命名空间的“潜质”。如果使用from导入变量,而那些变量碰巧和作用域中现有变量同名,变量就会被悄悄地覆盖掉。另一方面,和reload调用同时使用时,from语句有比较严重的问题,因为导入的变量名可能引用之前版本的对象。332.模块的创建与使用2.4模块命名空间模块最好理解为变量名的封装,也就是定义想让系统其余部分看见变量名的场所。简而言之,模块就是命名空间(变量名建立所在的场所),而存在于模块之内的变量名就是模块对象的属性。342.模块的创建与使用2.4模块命名空间1.文件生成命名空间模块语句会在首次导入时执行顶层的赋值语句会创建模块属性模块的命名空间能通过属性__dict__或dir(M)获取352.模块的创建与使用2.4模块命名空间LEGB(用来规定命名空间查找顺序的规则)含义解释如下。L-Local(function):函数内的名字空间。E-Enclosingfunctionlocals:外部嵌套函数的名字空间(例如closure)。G-Global(module):函数定义所在模块(文件)的名字空间。B-Builtin(Python):Python内置模块的名字空间。362.模块的创建与使用2.4模块命名空间假设往文本编辑器中建立如下的模块文件,并将其命名为module2.py。print('startingtoload...')importsysname=42deffunc(): pass #定义一个空函数,pass是占位符classklass: pass #定义一个空类,pass是占位符print('doneloading.')执行结果>>>importmodule2startingtoload...doneloading.372.模块的创建与使用2.4模块命名空间但是,一旦模块加载后,它的作用域就变成模块对象(由import取得)的属性的命名空间,然后可以结合其模块名,通过它来获取命名空间内的属性。>>>module2.sys<module'sys'(built-in)>>>>42>>>module2.func<functionfuncatox026D3BBB>>>>module2.klass<class'module2.klass'>382.模块的创建与使用2.4模块命名空间2.属性名的点号运算点号运算其实就是表达式,传回和对象相配的属性名的值,LEGB规则只适用于无点号运算的纯变量名。其规则如下:简单变量点号运算通用性。392.模块的创建与使用2.4模块命名空间3.导入和作用域无论程序中的导入结构或函数调用的结构是什么情况,变量的含义一定是由源代码中的赋值语句的位置决定的,而属性总是伴随着对对象的请求。换句话说,导入操作不会赋予被导入文件中的代码对上层代码的可见度。被导入文件无法看见进行导入的文件内的变量名。402.模块的创建与使用2.4模块命名空间4.命名空间的嵌套虽然模块导入不会使命名空间发生向上的嵌套,但会发生向下的嵌套。利用属性的点号运算路径,有可能深入到任意嵌套的模块中并读取其属性。412.模块的创建与使用2.5

reload在python中,每一个以.py结尾的Python文件都是一个模块,其他的文件可以通过导入一个模块来读取该模块的内容。默认情况下,模块在第一次被导入之后,其他的导入都不再有效。那么想要使得Python在同一次会话中再次运行文件,就需要调用imp标准库模块中的reload函数。422.模块的创建与使用2.5

reloadreload与import和from的不同之处如下。reload是Python*的内置函数,而不是语句。传给reload的是已经存在的模块对象,而不是变量名。reload在Python3.0中位于模块之中,并且必须导入自己。432.模块的创建与使用2.5

reload此外,import语句和reload调用的语法并不相同,reload需要小括号,但import不需要。重载如下所示:importmodule #初始导入usemodule.attributes #使用模块fromimpimportreload#获取重载函数reload(module) #重载模块usemodule.attributes…442.模块的创建与使用2.5

reload程序重载任何引用该模块对象的地方,自动会受到reload的影响,下面是一些细节:reload会在模块当前命名空间内执行模块文件的新代码文件中顶层赋值语句会使得变量名换成新值重载会影响所有使用import读取了模块的客户端重载只会对以后使用from的客户端造成影响45目录1.为什么使用模块2.模块的创建与使用3.包导入实例463.包导入实例包的组成Python的程序由包(package)、模块(module)和函数组成。包是由一系列模块组成的集合,模块是处理某一类问题的函数和类的集合,它们之间的关系如右图所示。473.包导入实例包与模块的树形图

首先定义一个包parent,在parent包中创建两个子包pack和pack2,pack包中定义一个模块myModule,pack2包中定义一个模块myModule2。最后在包parent中定义一个模块main,调用子包pack和pack2,树形图如右图所示。483.包导入实例包pack的__int__.py程序如下所示:if_name_=='_main_':print('作为主程序运行')else:

print('pack初始化')

这段代码初始化pack包,直接输出一段字符串。当pack包将其他模块调用时,将输出“pack初始化”。493.包导入实例包pack的myModule模块如下所示:deffunc():print("pack.myModule.func()")if_name_=='_main_':print('作为主程序运行')else:

print('pack初始化')当pack2包被其他模块调用时,先执行__int__.py文件。503.包导入实例pack2包的__int__.py程序如下所示。if_name_=='_main_':p

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论