Python模块定义和使用
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模块定义和使用的更多相关文章
- Python 模块定义、导入、优化详解
一.定义 模块:用来从逻辑上组织 python 代码(变量,函数,类, 逻辑:实现一个功能),本质就是 .py 结尾的 python文件(例如:test.py文件,对应的模块名:test) 包:用来从 ...
- python 模块定义导入
1.定义模块:用来从逻辑上组织python代码(变量.函数.类.逻辑:实现一个功能),本质就是:.py结尾的python文件(文件名:test.py,对应的模块名:test)包:本质就是一个目录(必须 ...
- python之定义参数模块argparse(二)高级使用 --传参为函数的实现
我们在文章python之定义参数模块argparse的基本使用中介绍了argparse模块的基本使用方法 当前传入的参数只能是int.str.float.comlex类型,不能为函数,这有点不方便,但 ...
- 第10.5节 使用__all__定义Python模块导入白名单
一. 引言 <第10.4节 Python模块的弱封装机制>介绍了Python模块的的弱封装机制,除了使用弱封装机制来从一定程度上防止导入特定成员外,Python模块中还提供可另外一种类似白 ...
- python 学习第五天,python模块
一,Python的模块导入 1,在写python的模块导入之前,先来讲一些Python中的概念性的问题 (1)模块:用来从逻辑上组织Python代码(变量,函数,类,逻辑:实现一个功能),本质是.py ...
- Python基础篇【第5篇】: Python模块基础(一)
模块 简介 在计算机程序的开发过程中,随着程序代码越写越多,在一个文件里代码就会越来越长,越来越不容易维护. 为了编写可维护的代码,我们把很多函数分组,分别放到不同的文件里,这样,每个文件包含的代码就 ...
- Python—模块
一.模块 模块,是用一堆代码实现了某个功能的代码集合,模块分为三种:自定义模块(自己定义).内置模块(python自带).开源模块 导入模块 (1).导入一个py文件,解释器解释该py文件 (2).导 ...
- python模块使用案例
python模块使用案例 一.使用MySQLdb模块代码示例: # 导入 MySQLdb模块 import MySQLdb # 和服务器建立链接,host是服务器ip,我的MySQL数据库搭建在本机, ...
- Python模块学习
6. Modules If you quit from the Python interpreter and enter it again, the definitions you have made ...
随机推荐
- laravel 常用命令
1.创建控制器 php artisan make:controller ArticleController // 带 restful 风格 php artisan make:controller Ar ...
- canvas 绘画随机点
直接看图吧: 这样的随机点,是小圆点组成的,然后一直在动,记录一下,万一以后要用到呢: canvas的具体设置我就不写了,另一篇文档里有: drawRandomDot () { let leftCan ...
- ORA-00847: MEMORY_TARGET/MEMORY_MAX_TARGET and LOCK_SGA cannot be set together
群里有位兄弟,测试系统修改sga_lock=true参数后,重启库报错 ORA-00847: MEMORY_TARGET/MEMORY_MAX_TARGET and LOCK_SGA cannot b ...
- elasticsearch 拼音检索能力研究
gitchennan/elasticsearch-analysis-lc-pinyin 配置参数少,功能满足需求. 对应版本 elasticsearch2.3.2 对应 elasticsearch-a ...
- cocos2dx自定义事件类封装
GameEvent.h: #pragma once #include "cocos2d.h" USING_NS_CC; class GameEvent { public: //封装 ...
- python 的排名,已经python的简单介绍
我在今天看了一篇文章,是简书的全网程序猿写的,Java已经退出神坛,python稳居第一. python是由龟叔写的,它在英文的意思是蟒蛇. 根据编程语言流行指数排行榜2019年2月的榜单 据了解,目 ...
- restframework细节学习
一.后端发送列表.字典 1. 发送字典出现safe error,需要如下处理 def books(request): ll=[{},{}] # return HttpResponse(json.dum ...
- 《Netty in action》 读书笔记
声明:这篇文章是记录读书过程中的知识点,并加以归纳总结,成文.文中图片.代码出自<Netty in action>. 1. 为什么用Netty? 每个框架的流行,都一定有它出众的地方.Ne ...
- 搭建简单的FTP服务器
客户端部分主要使用C#提供的webclient类 (https://msdn.microsoft.com/library/system.net.webclient.aspx) 通过WebClient. ...
- MySQL Execution Plan--IN查询计划(2)
在MySQL中,IN查找经常出现性能问题,相同SQL在MySQL不同版本中表现不同. 准备测试数据: ## 创建表tb001 CREATE TABLE tb001( id INT unsigned N ...