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 ...
随机推荐
- the principle of redbalck tree
- 关于multi-index
[转载请注明出处]http://www.cnblogs.com/mashiqi 2017/02/22 将$D^{\alpha}$和$\partial^{\alpha}$区别对待.$D^{\alpha} ...
- 第一天Python
一.开发语言 高级语言:Python Java.PHP 高级语言--字节码(PHP适用于写网页) 低级语言:C.汇编--机器码(底层开发,根本,效率低) 二.Python种类 三.安装
- nginx 代理flask应用的uwsgi配置
socket代理配置: 关于uwsgi的用法,请自行百度,这里只针对socket文件和端口的不同,进行单一的记录. 这种方式启动的flask应用,由于是通过socket与nginx通信的,所以必须制定 ...
- scoping作用域,anonymous function匿名函数,built-in functions内置函数
作用域练习1 def test1(): print('in the test1') def test(): print('in the test') return test1 res = test() ...
- googletest--Death Test和Exception Test
Death Test验证某个状态会使进程以某个错误码和错误消息离开 #include <gtest\gtest.h> #include "MyStack.h" // D ...
- servlet-jsp-EL 表达式
jsp--EL表达式 jsp表达式<%= %>用于向页面中输出一个对象.jsp2.0时在页面中不允许出现jsp表达式和脚本片段,于是使用EL表达式来代替jsp表达式,标签代替脚本片段 基本 ...
- Java的Finalizer引发的内存溢出
本文介绍的是Java里一个内建的概念,Finalizer.你可能对它对数家珍,但也可能从未听闻过,这得看你有没有花时间完整地看过一遍java.lang.Object类了.在java.lang.Obje ...
- Grafana+Prometheus打造springboot监控平台
1. 环境 springboot 1.5.10.RELEASE Grafana 5.4.2 Prometheus 2.6.0 jdk 1.8 2.通过micrometer与springboot应用和p ...
- 源码小结:Java 集合ArrayList,LinkedList 源码
现在这篇主要讲List集合的三个子类: ArrayList 底层数据结构是数组.线程不安全 LinkedList 底层数据结构是链表.线程不安全 Vector 底层数据结构是数组.线程安全 Array ...