Python 关于模块和加载模块的实现

一.导入模块

模块(Modules)

模块就是Python程序,任何Python程序都可以作为模块

代码的可重用性,只要编程过程中需要用到该模块中的某个功能(由变量、函数、类实现),直接在程序中导入该模块即可使用该功能

封装特性的结构:

诸多容器,列表、元组、字符串、字典等都是对数据的封装
函数是对 Python 代码的封装
类是对方法和属性的封装,是对函数和数据的封装

模块,可以理解是对代码更高级的封装,把能够实现某一特定功能的代码编写在同一个.py 文件中,并将其作为一个独立的模块,还能有效避免函数名和变量名发生冲突

当程序重复导入同一个模块时,Python 只会导入一次

import

import 模块名1 [as 别名1], 模块名2 [as 别名2],…

会导入指定模块中的所有成员(包括变量、函数、类等),需要使用模块中的成员时,需用该模块名(别名)作为前缀,否则解释器会报错

[] 部分,可以使用,也可以省略

sys模块下的argv变量用于获取运行程序的命令行参数,argv[0]用于获取当前 程序的存储路径

import sys #导入sys整个模块
print(sys.argv[0]) # 用sys模块内的成员时,必须添加模块名作为前缀
C:/Users/Administrator/Desktop/2021-1-14/模块.py

导入整个模块时,可以为模块指定别名

import sys as s # 导入sys整个模块,指定别名为s
print(s.argv[0]) # 使用sys模块别名s作为前缀来访问模块中的成员
C:/Users/Administrator/Desktop/2021-1-14/模块.py

可以一次导入多个模块,多个模块之间用逗号隔开

import sys,os # 导入sys、os两个模块
print(sys.argv[0]) # 使用模块名作为前缀来访问模块中的成员
print(os.sep) # os模块的sep变量代表平台上的路径分隔符
C:/Users/Administrator/Desktop/2021-1-14/模块.py
\

导入多个模块时,也可以为模块指定别名

import sys as s,os as o # 导入模块,并分别为模块指定别名
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来导入指定成员

from sys import argv # 导入sys模块的argv成员
print(argv[0]) # 直接使用成员名访问
C:/Users/Administrator/Desktop/2021-1-14/模块.py

导入sys模块中的 argv 成员,可在程序中直接使用 argv 成员,无须使用任何前缀

导入模块成员时,为成员指定别名

from sys import argv as v # 导入sys模块的argv成员,为其指定别名v
print(v[0]) # 直接使用成员的别名访问
C:/Users/Administrator/Desktop/2021-1-14/模块.py

form...import 导入模块成员时,可一次导入多个成员

from sys import argv, winver # 导入sys模块的argv,winver成员
print(argv[0]) # 直接使用成员名访问
print(winver)
C:/Users/Administrator/Desktop/2021-1-14/模块.py
3.4

sys模块的winver成员记录了该 Python 的版本号

一次导入多个模块成员时,可使用 as 关键字为成员指定别名

from sys import argv as v, winver as wv # 导入sys模块的成员,并为其指定别名
print(v[0]) # 直接使用成员的别名访问
print(wv)
C:/Users/Administrator/Desktop/2021-1-14/模块.py
3.4

不推荐使用 from 模块 import * 导入模块所有成员

导入指定模块内的所有成员存在潜在的风险,可能会出现同名成员

可通过别名来区分两个模块中的同名成员

__import __()

模块是代码文件,要求其文件名要符合操作系统的命名规则,如果模块名中出现空格或数字开头,无法使用 import 引入

如果模块中包含空格或以数字开头,需要使用__import__() 内置函数引入模块

__import__("demo text")

__import__("1demo")

使用import()函数要以字符串的方式将模块名引入,否则会报SyntaxError错误

二.自定义模块

定义简单的模块(编写在 demo.py 文件中)

name = "youchanwill"
add = "you.com"
print(name,add)
def say():
 print("自定义模块")
class test:
 def __init__(self,name,add):
  self.name = name
  self.add = add
 def say(self):
  print(self.name,self.add)

为了检验模板中代码的正确性,需要为其设计一段测试代码

say()
test1 = test("you","you.net")
test1.say()

在同一文件夹下新建一个test.py文件,使用 import 语句导入 demo.py

import demo #用import 语句导入时,只需要使用该模板文件的名称
youchanwill you.com
自定义模块 #测试代码也被执行
you you.net 

其它程序以引入的方式执行模板文件,测试代码不应该被执行,可用__name__ 变量做修改

当直接运行一个模块时,__name__变量的值为__main__,而模块被导入其他程序中并运行该程序时,处于模块中的__name__变量的值就变成了模块名

可在调用测试函数时增加判断,当 __name__ =='__main__' 时才调用测试函数

修改 demo.py 模板文件中的测试代码:

if __name__ == '__main__':
 say()
 test1 = test("you","you.net")
 test1.say()

修改后运行 test.py 文件时

import demo
youchanwill you.com

执行的是模板文件中的输出语句,测试代码并未执行

说明文档

自定义模块添加说明文档,和函数或类的添加方法相同,在模块开头的位置定义一个字符串

可以通过模板的 __doc__ 属性,来访问模板的说明文档

import demo
print(demo.__doc__)
youchanwill you.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 变量的语句

export PYTHONPATH

运行该文件,使在文件中设置的 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)
def say():
 print("自定义模块")
class test:
 def __init__(self,name,add):
  self.name = name
  self.add = add
 def say(self):
  print(self.name,self.add)
if __name__ == '__main__':
 say()
 test1 = test("you","you.net")
 test1.say()

可直接在Python交互式解释器中测试该模块

>>> import demo
youchanwill you.com
>>> print(demo.__doc__)

这是说明文档

>>>
第一行代码用于导入demo模块;第二行代码用于查看demo模块的文档,输出该模块开始定义的文档内容

导入模块的本质

import demo 导入模块的本质是将 demo.py 中的全部代码加载到内存并执行
将整个模块内容赋值给与模块同名的变量,该变量的类型是 module,在该模块中定义的所有程序单元都相当于该 module 对象的成员

from demo import name 导入模块中成员的本质是将 demo.py 中的全部代码加载到内存并执行
只导入指定变量、函数等成员单元,不会将整个模块导入

在导入模块后,在模块文件所在目录下看到一个名为“__pycache__”的文件夹
Python 为每个模块都生成一个 *.cpython-36.pyc 文件,该文件是为模块编译生成的字节码,用于提升该模块的运行效率

四.__all__变量

向文件导入某个模块时,导入的是该模块中那些名称不以下划线(单下划线、双下划线)开头的变量、函数和类

如果不想模块文件中的某个成员被引入到其它文件中使用,可以在其名称前添加下划线

新建demo.py文件

def test1():
 print("you")
def test2():
 print("chan")
def test3():
 print("will")

在新建的test.py文件中导入

from demo import *
test1()
test2()
test3()
you
chan
will

如果 demo.py 模块中的 test1() 函数不想让其它文件引入,只需将其名称改为 _test1() 或者 __test1()

def _test1():
 print("you")

NameError: name 'test1' is not defined

__all__ 变量,该变量的值是一个列表,存储的是当前模块中一些成员(变量、函数或者类)的名称

通过在模块文件中设置 __all__ 变量,当其它文件以“from 模块名 import *”的形式导入该模块时,该文件中只能使用 __all__ 列表中指定的成员

只有以“from 模块名 import *”形式导入的模块,当该模块设有 __all__ 变量时,只能导入该变量指定的成员,未指定的成员无法导入

def test1():
 print("you")
def test2():
 print("chan")
def test3():
 print("will")
__all__ = ["test1","test2"]

from demo import *
test1()
test2()
test3()
you
chan
NameError: name 'test3' is not defined

__all__ 变量仅限于在其它文件中以“from 模块名 import *”的方式引入

import 模块名 的形式导入模块,可以通过模块名前缀(别名)来调用模块内的所有成员(除了以下划线开头命名的成员),__all__变量的设置无效

from 模块名 import 成员 导入指定成员,__all__变量的设置无用

到此这篇关于Python 关于模块和加载模块的实现的文章就介绍到这了,更多相关Python 模块和加载模块内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • Python新手如何理解循环加载模块

    循环加载模块 假设你有两个文件,a.py和b.py,在这两个文件中互相加载对方,例如: 在a.py中: import b def f(): return b.x print f() 在b.py中: import a x = 1 def g(): print a.f() 首先,我们试着加载a.py: >>> import a 1 没有问题.也许让人吃惊,毕竟有个感觉应该是问题的循环加载在这儿. 事实上在Python中仅仅是表面上的出现循环加载并不是什么问题.如果一个模块以及被加载了,Pyt

  • Python重新加载模块的实现方法

    importlib 模块的作用 模块,是一个一个单独的py文件 包,里面包含多个模块(py文件) 动态导入模块,这样就不用写那么多的import代码, 典型的例子: 自动同步服务,每个网站都有一个py文件.主进程里收到同步任务,根据名称来动态导入对应的py文件,这样就不用写那么多的import代码.(有点类似java的工厂方法) 但是,importlib并不能解决我在线修改py源码,再不重启进程的情况下,使修改生效. 这种情况,可以使用reload() reload方法 为防止两个模块互相导入的

  • Python动态加载模块的3种方法

    1.使用系统函数__import_() 复制代码 代码如下: stringmodule = __import__('string') 2.使用imp 模块 复制代码 代码如下: import imp stringmodule = imp.load_module('string',*imp.find_module('string')) 3.使用exec 复制代码 代码如下: import_string = "import string as stringmodule" exec impo

  • Python实现动态加载模块、类、函数的方法分析

    本文实例讲述了Python实现动态加载模块.类.函数的方法.分享给大家供大家参考,具体如下: 动态加载模块: 方式1:系统函数__import__() 方式2:imp, importlib 模块 方式3:exec 函数 动态加载类和函数 首先,使用加载模块,使用内置函数提供的反射方法getattr(),依次按照层级获取模块->类\全局方法->类对象\类方法. test_import_module.py class ClassA: def test(self): print('test') in

  • Python如何重新加载模块

    问题 你想重新加载已经加载的模块,因为你对其源码进行了修改. 解决方案 使用imp.reload()来重新加载先前加载的模块.举个例子: >>> import spam >>> import imp >>> imp.reload(spam) <module 'spam' from './spam.py'> >>> 讨论 重新加载模块在开发和调试过程中常常很有用.但在生产环境中的代码使用会不安全,因为它并不总是像您期望的那样

  • Python自动重新加载模块详解(autoreload module)

    守护进程模式 使用python开发后台服务程序的时候,每次修改代码之后都需要重启服务才能生效比较麻烦. 看了一下Python开源的Web框架(Django.Flask等)都有自己的自动加载模块功能(autoreload.py),都是通过subprocess模式创建子进程,主进程作为守护进程,子进程中一个线程负责检测文件是否发生变化,如果发生变化则退出,主进程检查子进程的退出码(exist code)如果与约定的退出码一致,则重新启动一个子进程继续工作. 自动重新加载模块代码如下: autorel

  • Python之inspect模块实现获取加载模块路径的方法

    该文主要介绍如何获取模块的路径,需要申明的是这里所说的模块可以是功能实现的该模块,也可以是别的模块. 使用到的是 inspect 模块的 .getsourcefile(需要获取的模块名) 创建test.py内容如下: import os import inspect class pathManager(object): def __init__(self): pass def _abPath(self): modulePath = inspect.getsourcefile(os) abPath

  • Python 关于模块和加载模块的实现

    一.导入模块 模块(Modules) 模块就是Python程序,任何Python程序都可以作为模块 代码的可重用性,只要编程过程中需要用到该模块中的某个功能(由变量.函数.类实现),直接在程序中导入该模块即可使用该功能 封装特性的结构: 诸多容器,列表.元组.字符串.字典等都是对数据的封装 函数是对 Python 代码的封装 类是对方法和属性的封装,是对函数和数据的封装 模块,可以理解是对代码更高级的封装,把能够实现某一特定功能的代码编写在同一个.py 文件中,并将其作为一个独立的模块,还能有效

  • Python标准库之Sys模块使用详解

    sys 模块提供了许多函数和变量来处理 Python 运行时环境的不同部分. 处理命令行参数 在解释器启动后, argv 列表包含了传递给脚本的所有参数, 列表的第一个元素为脚本自身的名称. 使用sys模块获得脚本的参数 复制代码 代码如下: print "script name is", sys.argv[0]        # 使用sys.argv[0]采集脚本名称 if len(sys.argv) > 1:     print "there are",

  • Python引用模块和查找模块路径

    模块间相互独立相互引用是任何一种编程语言的基础能力.对于"模块"这个词在各种编程语言中或许是不同的,但我们可以简单认为一个程序文件是一个模块,文件里包含了类或者方法的定义.对于编译型的语言,比如C#中的一个.cs文件,Java中的一个.java或者编译后的.class文件可以认为是一个模块(但常常不表述为模块):对于解释型的语言会更加直观些,比如PHP的.php文件,在Python中就是.py文件可以认为是一个模块.在"模块"之上有"包",主要是

  • Python常用内置模块之xml模块(详解)

    xml即可扩展标记语言,它可以用来标记数据.定义数据类型,是一种允许用户对自己的标记语言进行定义的源语言.从结构上,很像HTML超文本标记语言.但他们被设计的目的是不同的,超文本标记语言被设计用来显示数据,其焦点是数据的外观.它被设计用来传输和存储数据,其焦点是数据的内容.那么Python是如何处理XML语言文件的呢?下面一起来看看Python常用内置模块之xml模块吧. 本文主要学习的ElementTree是python的XML处理模块,它提供了一个轻量级的对象模型.在使用ElementTre

随机推荐