Python中所谓的模块就是一个Python文件,一个abc.py的文件就是一个名字叫abc的模块,一个xyz.py的文件就是一个名字叫xyz的模块。模块由代码、函数或类组成。编程中使用模块不仅可以提高代码的可维护性,还可以提高代码可复用性。通过引用模块,每次编程不用都从0开始,引用模块的类型可以是Python内置的模块,也可以是第三方的模块。本文主要介绍内容包括:

(1)模块的定义。

(2)模块的查找路径和使用方法。

(3)模块的基本属性。

模块的创建

模块把一组相关的函数或代码组织到一个文件中,一个文件就是一个模块。模块由代码、函数或类组成。创建一个名为myModule.py的文件,就表示定义了一个名为myModule的模块。假设myModule.py内容如下:

def func():
print "myModule.func()" class MyClass:
def myFunc(self):
print "myModule.MyClass.myFunc()"

在myModule模块中定义了一个函数func()和一个类MyClass。我们在myModule.py所在的目录下继续创建一个call_myModule.py的文件。在该文件中调用myModule模块的函数和类。call_myModule.py文件内容如下:

import myModule

myModule.func()
myClass = myModule.MyClass()
myClass.myFunc()

输出结果如下:

myModule.func()
myModule.Myclass.myFunc()

通过输出结果,我们可以知道在call_myModule程序中成功调用了myModule模块的func()函数和MyClass类中的myFunc()方法。到这里,我们就学会了模块创建和调用的基本用法。但回顾这个例子,在模块定义和使用时我们提前做了几个约束:

(1)调用程序call_myModule.py被要求与被调用的myModule模块在一个文件目录下。如果不在一个目录下会有什么问题?如何处理?

(2)导入模块使用import语句。除了import myModule语句,还有其他形式的语句可以用?

(3)myModule模块不存在调用func()和MyClass.myFunc()语句。如果存在,调用该模块的程序会出现重复打印吗?如何处理?

上述3个问题,问题(1)与Python模块查找路径有关,问题(2)与模块导入的方法有关,问题(3)与模块的属性有关,下面开始分别介绍。

Python查找模块路径

当Python导入一个模块时,Python首先查找当前路径,然后查找lib目录、site-packages目录(安装目录\Lib\site-packages)和环境变量PYTHONPATH设置的目录。简单的说,被调用的模块(包括自定义模块)可以放在和调用程序的文件在同一个层级目录下,或者放在sys.path所列出的目录下。sys.path的目录通常如下所示:

>>> import sys
>>> sys.path
['', 'C:\\WINDOWS\\SYSTEM32\\python27.zip', 'c:\\Python27\\DLLs', 'c:\\Python27\\lib', 'c:\\Python27\\lib\\plat-win', 'c:\\Python27\\lib\\lib-tk', 'c:\\Python27', 'c:\\Python27\\lib\\site-packages', 'c:\\Python27\\lib\\site-packages\\win32', 'c:\\Python27\\lib\\site-packages\\win32\\lib', 'c:\\Python27\\lib\\site-packages\\Pythonwin']

我们重新看上述的例子,假设myModule.py文件在D:\temp目录下,与call_myModule程序不在同一个层级目录下。那么我们可以将D:\temp目录添加到sys.path目录,实例如下:

import sys,
sys.path.append('D:\\temp')
import myModule myModule.func()
myClass = myModule.MyClass()
myClass.myFunc()

输出结果如下:

myModule.func()
myModule.Myclass.myFunc()

因此,如果在调试程序过程中出现ImportError: No module named myModule错误时,可以通过sys.path语句下的路径查找下是否存在提示的不存在的模块。

模块的导入方法

在使用一个模块的函数或类之前,首先要导入模块。模块的导入使用import语句格式如下:

import 模块名

这条语句可以直接导入一个模块。调用模块的函数或类时,需要以模块名作为前缀,使用格式如下所示:

模块名.函数名()

import语句的用法在上述例子中已经实践共了。但是如果不想在程序中使用前缀符,可以使用from...import...语句导入,from...import...语句导入主要有3种形式:

(1)导入模块中指定的函数或类

from 模块名 import 函数名

修改上述call_myModule.py的程序,代码如下:

import sys
sys.path.append('D:\\temp') from myModule import func, MyClass func()
myClass = MyClass()
myClass.myFunc()

(2)导入模块中所有的函数和类

import sys
sys.path.append('D:\\temp') from myModule import * func()
myClass = MyClass()
myClass.myFunc()

(3)导入模块中指定的函数和类,并修改为指定名称

import sys
sys.path.append('D:\\temp') from myModule import func as myModule_func myModule_func()

模块的属性

模块有一些内置属性,用于完成特定的任务,如__name__、__doc__。每个模块都有一个名称,例如,__name__用于判断当前模块是否是程序的入口,如果当前程序正在被使用,__name__的值为"__main__"。通常给每个模块都添加一个条件语句,用于单独测试该模块功能。修改myModule.py,代码如下:

def func():
print "myModule.func()" class MyClass:
def myFunc(self):
print "myModule.Myclass.myFunc()" if __name__ == '__main__':
print "myModule execute as main program"
else:
print "myModule called by other program"

执行call_myModule.py调用程序,获取结果如下:

myModule called by other program
myModule.func()
myModule.Myclass.myFunc()

通过输出结果可以知道,myModule模块被call_myModule.py程序调用时if __name__ == '__main__'条件下的语句块不会被执行。现在知道问题(3)怎么解决了吗?将主程序放在if __name__ == '__main__'条件中的语句块就可以了。

小结

学完本文,你知道如何调用自定义的模块了吗?自己动手写一个模块并尝试导入吧~~

Python模块定义和使用的更多相关文章

  1. Python 模块定义、导入、优化详解

    一.定义 模块:用来从逻辑上组织 python 代码(变量,函数,类, 逻辑:实现一个功能),本质就是 .py 结尾的 python文件(例如:test.py文件,对应的模块名:test) 包:用来从 ...

  2. python 模块定义导入

    1.定义模块:用来从逻辑上组织python代码(变量.函数.类.逻辑:实现一个功能),本质就是:.py结尾的python文件(文件名:test.py,对应的模块名:test)包:本质就是一个目录(必须 ...

  3. python之定义参数模块argparse(二)高级使用 --传参为函数的实现

    我们在文章python之定义参数模块argparse的基本使用中介绍了argparse模块的基本使用方法 当前传入的参数只能是int.str.float.comlex类型,不能为函数,这有点不方便,但 ...

  4. 第10.5节 使用__all__定义Python模块导入白名单

    一. 引言 <第10.4节 Python模块的弱封装机制>介绍了Python模块的的弱封装机制,除了使用弱封装机制来从一定程度上防止导入特定成员外,Python模块中还提供可另外一种类似白 ...

  5. python 学习第五天,python模块

    一,Python的模块导入 1,在写python的模块导入之前,先来讲一些Python中的概念性的问题 (1)模块:用来从逻辑上组织Python代码(变量,函数,类,逻辑:实现一个功能),本质是.py ...

  6. Python基础篇【第5篇】: Python模块基础(一)

    模块 简介 在计算机程序的开发过程中,随着程序代码越写越多,在一个文件里代码就会越来越长,越来越不容易维护. 为了编写可维护的代码,我们把很多函数分组,分别放到不同的文件里,这样,每个文件包含的代码就 ...

  7. Python—模块

    一.模块 模块,是用一堆代码实现了某个功能的代码集合,模块分为三种:自定义模块(自己定义).内置模块(python自带).开源模块 导入模块 (1).导入一个py文件,解释器解释该py文件 (2).导 ...

  8. python模块使用案例

    python模块使用案例 一.使用MySQLdb模块代码示例: # 导入 MySQLdb模块 import MySQLdb # 和服务器建立链接,host是服务器ip,我的MySQL数据库搭建在本机, ...

  9. Python模块学习

    6. Modules If you quit from the Python interpreter and enter it again, the definitions you have made ...

随机推荐

  1. CMD命令,动态执行存储或DML命令

    --exec master..xp_cmdshell CMD命令 --EXECUTE sys.sp_sqlexec 执行存储 --EXEC sp_executesql 执行DML语句

  2. [BUG]读配置文件中文, 查询不到数据库

    配置文件编码, 要和数据库编码一致

  3. 内存泄露java.lang.OutOfMemoryError: PermGen space解决方法

    PermGen space的全称是Permanent Generation space,是指内存的永久保存区域,这块内存主要是被JVM存放Class和Meta信息的,Class在被Loader时就会被 ...

  4. 构建gulp项目

    express是node.js中的构建工具,如果需要使用express构建,首先需要安装express. 构建一个项目: |-- app| |-- css| |-- js| | `-- class| ...

  5. 《从Lucene到Elasticsearch:全文检索实战》学习笔记五

    今天我给大家讲讲tf-idf权重计算 tf-idf权重计算: tf-idf(中文词频-逆文档概率)是表示计算词项对于一个文档集或语料库中的一份文件的重要程度.词项的重要性随着它在文档中出现的次数成正比 ...

  6. PythonStudy——数据类型总结 Data type summary

    按存储空间的占用分(从低到高) 数字 字符串 集合:无序,即无序存索引相关信息,可变.集合中的元素必须是可hash的,即不可变的数据类型. 元组:有序,需要存索引相关信息,不可变 列表:有序,需要存索 ...

  7. Java虚拟机的内部体系结构

    1.Java程序执行流程 Java程序的执行依赖于编译环境和运行环境.源码代码转变成可执行的机器代码,由下面的流程完成: Java技术的核心就是Java虚拟机,因为所有的Java程序都在虚拟机上运行. ...

  8. mysql查询中AND与OR注意事项

    在查询的where条件中,and要优于or 如果要改变优先级, 需要在最小逻辑判断的条件外加括号(),例如: select * from `table_name` where (`type` = 1 ...

  9. linux-linnode满了的提示

    线上有一台web服务器磁盘检测告警了,提示空间不足,登到服务器查看 <ignore_js_op> touch:cannot touch `furm.html': No space left ...

  10. 阿里四不像Fourinone

    阿里四不像——分布式核心技术框架 Fourinone https://blog.csdn.net/shero_zsmj/article/details/52277194