Python 关于模块和加载模块的实现
一.导入模块
模块(Modules)
模块就是Python程序,任何Python程序都可以作为模块
代码的可重用性,只要编程过程中需要用到该模块中的某个功能(由变量、函数、类实现),直接在程序中导入该模块即可使用该功能
封装特性的结构:
诸多容器,列表、元组、字符串、字典等都是对数据的封装
函数是对Python代码的封装
类是对方法和属性的封装,是对函数和数据的封装
模块,可以理解是对代码更高级的封装,把能够实现某一特定功能的代码编写在同一个.py文件中,并将其作为一个独立的模块,还能有效避免函数名和变量名发生冲突
当程序重复导入同一个模块时,Python只会导入一次
import
import模块名1[as别名1],模块名2[as别名2],…
会导入指定模块中的所有成员(包括变量、函数、类等),需要使用模块中的成员时,需用该模块名(别名)作为前缀,否则解释器会报错
[]部分,可以使用,也可以省略
sys模块下的argv变量用于获取运行程序的命令行参数,argv[0]用于获取当前程序的存储路径
importsys#导入sys整个模块 print(sys.argv[0])#用sys模块内的成员时,必须添加模块名作为前缀 C:/Users/Administrator/Desktop/2021-1-14/模块.py
导入整个模块时,可以为模块指定别名
importsysass#导入sys整个模块,指定别名为s print(s.argv[0])#使用sys模块别名s作为前缀来访问模块中的成员 C:/Users/Administrator/Desktop/2021-1-14/模块.py
可以一次导入多个模块,多个模块之间用逗号隔开
importsys,os#导入sys、os两个模块 print(sys.argv[0])#使用模块名作为前缀来访问模块中的成员 print(os.sep)#os模块的sep变量代表平台上的路径分隔符 C:/Users/Administrator/Desktop/2021-1-14/模块.py \
导入多个模块时,也可以为模块指定别名
importsysass,osaso#导入模块,并分别为模块指定别名 print(s.argv[0])#使用模块别名作为前缀来访问模块中的成员 print(o.sep) C:/Users/Administrator/Desktop/2021-1-14/模块.py \
from…import
from模块名import成员名1[as别名1],成员名2[as别名2],…
只会导入模块中指定的成员,而不是全部成员,当程序中使用该成员时,无需加任何前缀,直接使用成员名(或别名)
[]部分,可以使用,也可以省略
用from...import来导入指定成员
fromsysimportargv#导入sys模块的argv成员 print(argv[0])#直接使用成员名访问 C:/Users/Administrator/Desktop/2021-1-14/模块.py
导入sys模块中的argv成员,可在程序中直接使用argv成员,无须使用任何前缀
导入模块成员时,为成员指定别名
fromsysimportargvasv#导入sys模块的argv成员,为其指定别名v print(v[0])#直接使用成员的别名访问 C:/Users/Administrator/Desktop/2021-1-14/模块.py
form...import导入模块成员时,可一次导入多个成员
fromsysimportargv,winver#导入sys模块的argv,winver成员 print(argv[0])#直接使用成员名访问 print(winver) C:/Users/Administrator/Desktop/2021-1-14/模块.py 3.4
sys模块的winver成员记录了该Python的版本号
一次导入多个模块成员时,可使用as关键字为成员指定别名
fromsysimportargvasv,winveraswv#导入sys模块的成员,并为其指定别名 print(v[0])#直接使用成员的别名访问 print(wv) C:/Users/Administrator/Desktop/2021-1-14/模块.py 3.4
不推荐使用from模块import*导入模块所有成员
导入指定模块内的所有成员存在潜在的风险,可能会出现同名成员
可通过别名来区分两个模块中的同名成员
__import__()
模块是代码文件,要求其文件名要符合操作系统的命名规则,如果模块名中出现空格或数字开头,无法使用import引入
如果模块中包含空格或以数字开头,需要使用__import__()内置函数引入模块
__import__("demotext") __import__("1demo")
使用import()函数要以字符串的方式将模块名引入,否则会报SyntaxError错误
二.自定义模块
定义简单的模块(编写在demo.py文件中)
name="youchanwill" add="you.com" print(name,add) defsay(): print("自定义模块") classtest: def__init__(self,name,add): self.name=name self.add=add defsay(self): print(self.name,self.add)
为了检验模板中代码的正确性,需要为其设计一段测试代码
say() test1=test("you","you.net") test1.say()
在同一文件夹下新建一个test.py文件,使用import语句导入demo.py
importdemo#用import语句导入时,只需要使用该模板文件的名称 youchanwillyou.com 自定义模块#测试代码也被执行 youyou.net
其它程序以引入的方式执行模板文件,测试代码不应该被执行,可用__name__变量做修改
当直接运行一个模块时,__name__变量的值为__main__,而模块被导入其他程序中并运行该程序时,处于模块中的__name__变量的值就变成了模块名
可在调用测试函数时增加判断,当__name__=='__main__'时才调用测试函数
修改demo.py模板文件中的测试代码:
if__name__=='__main__': say() test1=test("you","you.net") test1.say()
修改后运行test.py文件时
importdemo youchanwillyou.com
执行的是模板文件中的输出语句,测试代码并未执行
说明文档
自定义模块添加说明文档,和函数或类的添加方法相同,在模块开头的位置定义一个字符串
可以通过模板的__doc__属性,来访问模板的说明文档
importdemo print(demo.__doc__) youchanwillyou.com
这是说明文档
三.加载模块
环境变量
根据PYTHONPATH环境变量的值来确定到哪里去加载模块
PYTHONPATH环境变量的值是多个路径的集合,会依次搜索PYTHONPATH环境变量所指定的多个路径,从中找到程序想要加载的模块
在Windows平台上设置环境变量
右击桌面上的“计算机”图标,单击“属性”菜单项,系统显示“控制面板\所有控制面板项\系统”窗口,单击该窗口左边栏中的“高级系统设置”链接,出现“系统属性”对话框
单击“高级”Tab页中的“环境变量”,对于当前用户而言,设置用户变量和系统变量的效果大致相同,系统变量的路径排在用户变量的路径之前
在“变量名”内输入PYTHONPATH,表明将要建立的环境变量;在“变量值”内输入.;d:\python_module,就是该环境变量的值,该值包含两条路径
第一条路径为一个点(.),代表当前路径,表明当运行Python程序时,总能从当前路径加载模块
第二条路径为d:\python_module,表明当运行Python程序时,总能从d:\python_module加载模块
成功设置了环境变量后,只要把定义的模块放在与当前运行程序相同的路径(或d:\python_module路径),该模块就能被成功加载
在Linux上设置环境变量
启动Linux的命令行界面,在home路径下输入:
ls-a
Linux平台的环境变量通过.bash_profile文件设置,在该文件中添加PYTHONPATH环境变量
PYTHONPATH=.:/home/you/python_module#you是系统的登录名
Linux多个路径之间以冒号(:)作为分隔符
完成变量值的设置后,在.bash_profile文件的最后添加导出PYTHONPATH变量的语句
exportPYTHONPATH
运行该文件,使在文件中设置的PYTHONPATH变量值生效
可选择重新登录Linux平台,或输入source.bash_profile
成功设置了环境变量后,只要把定义的模块放在与当前运行程序相同的路径(或/home/yeeku/python_module路径),该模块就能被成功加载
默认的模块加载路径
安装通用性模块,这种模块应该直接安装在Python内部,可借助Python默认的模块加载路径
通常情况下,应将Python的扩展模块添加在lib\site-packages路径下,专门用于存放扩展模块和包
将之前的demo.py文件复制在lib\site-packages路径下
''' 这是说明文档 ''' name="youchanwill" add="you.com" print(name,add) defsay(): print("自定义模块") classtest: def__init__(self,name,add): self.name=name self.add=add defsay(self): print(self.name,self.add) if__name__=='__main__': say() test1=test("you","you.net") test1.say()
可直接在Python交互式解释器中测试该模块
>>>importdemo youchanwillyou.com >>>print(demo.__doc__)
这是说明文档
>>>
第一行代码用于导入demo模块;第二行代码用于查看demo模块的文档,输出该模块开始定义的文档内容
导入模块的本质
importdemo导入模块的本质是将demo.py中的全部代码加载到内存并执行
将整个模块内容赋值给与模块同名的变量,该变量的类型是module,在该模块中定义的所有程序单元都相当于该module对象的成员
fromdemoimportname导入模块中成员的本质是将demo.py中的全部代码加载到内存并执行
只导入指定变量、函数等成员单元,不会将整个模块导入
在导入模块后,在模块文件所在目录下看到一个名为“__pycache__”的文件夹
Python为每个模块都生成一个*.cpython-36.pyc文件,该文件是为模块编译生成的字节码,用于提升该模块的运行效率
四.__all__变量
向文件导入某个模块时,导入的是该模块中那些名称不以下划线(单下划线、双下划线)开头的变量、函数和类
如果不想模块文件中的某个成员被引入到其它文件中使用,可以在其名称前添加下划线
新建demo.py文件
deftest1(): print("you") deftest2(): print("chan") deftest3(): print("will")
在新建的test.py文件中导入
fromdemoimport* test1() test2() test3() you chan will
如果demo.py模块中的test1()函数不想让其它文件引入,只需将其名称改为_test1()或者__test1()
def_test1(): print("you") NameError:name'test1'isnotdefined
__all__变量,该变量的值是一个列表,存储的是当前模块中一些成员(变量、函数或者类)的名称
通过在模块文件中设置__all__变量,当其它文件以“from模块名import*”的形式导入该模块时,该文件中只能使用__all__列表中指定的成员
只有以“from模块名import*”形式导入的模块,当该模块设有__all__变量时,只能导入该变量指定的成员,未指定的成员无法导入
deftest1(): print("you") deftest2(): print("chan") deftest3(): print("will") __all__=["test1","test2"] fromdemoimport* test1() test2() test3() you chan NameError:name'test3'isnotdefined
__all__变量仅限于在其它文件中以“from模块名import*”的方式引入
import模块名的形式导入模块,可以通过模块名前缀(别名)来调用模块内的所有成员(除了以下划线开头命名的成员),__all__变量的设置无效
from模块名import成员导入指定成员,__all__变量的设置无用
到此这篇关于Python关于模块和加载模块的实现的文章就介绍到这了,更多相关Python模块和加载模块内容请搜索毛票票以前的文章或继续浏览下面的相关文章希望大家以后多多支持毛票票!
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。