在python中,模块只是一个由python语句组成的文件。在模块中可以定义函数和类,还可以包含简单的可执行代码
模块可以包含说胆如何使用模块代码的文档
模块 只是一个python源文件。它可以包含变量、类、函数和python脚本中可用到的其他任何元素。
通过使用dir函数可以更好地理解模块。给dir函数传递某个python元素的名称,它将列出该元素的所有属性。
1 导入模块
在使用一个模块之前,需要先导入它:
import module
from module import item 仅导入所需要的一个类或函数
可以使用imp.reload函数重新加载模块的新定义
import module
import imp
imp.reload(module) 需要使用贺括号
2 查找模块
对于一个模块,python解释器首先查找一个称为module.py的文件,其中module是传递给import语句 模块的名称。当找到该模块时,python解释器将它编译成一个.pyc文件。当再次导入模块时,python解释器可以加载编译好的模块,加速python脚本的运行。
在脚本中编写了一个import语句时,python解释器必须能够找到该模块。关键的问题是,python解释器只查找一定数量的目录。如果python解释器不能找到,将显示一个错误。
sys模块的sys.path变量中 列出搜索目录
3 创建模块和包
一个python文件就是一个模块 添加一个food.py文件
def favoriteFood():
print("the only food worth eating is an omelet.")
>>> import food
>>> dir(food)
['__builtins__', '__cached__', '__doc__', '__file__', '__loader__', '__name__', '__package__', '__spec__', 'favoriteFood']
>>> food.favoriteFood()
the only food worth eating is an omelet.
>>> from food import favoriteFood
>>> favoriteFood()
the only food worth eating is an omelet.
4 面向对象编程
封装: 一个类能够隐藏执行某个任务所需的内部细节和数据。是一种简化程序的技术。隐藏了复杂性。
继承:一个类可以继承或访问父类中定义的数据和方法。可以在基类中编写通用的代码,在子类中编写具体的代码
多态:子类可以重写方法来完成更特殊的行为
定义异常类:如果标准的异常类合适要使用标准的异常类,如果不合适,需要针对使用模块时可能发生的特定问题定义异常
5 导入
from module_name import * 从模块导入所有的公有项
星号 告诉python解释器导入模块的全部公有方法。
如果 模块中定义了变量__all__,解释器使用__all__确定哪些项是公有项
如果模块中没有定义变量__all__,解释器导入除了名称以下划线开头的项目之外的所有项
总是应访在模块中定义__all__ 这样可以显式控制其他python脚本可以导入的项。
总是应该明确地定义希望从模块中导出什么。也应该总是为模块建立文档。
6 为模块建立文档
对于要写入文档的每一项,都要写一个文档字符串来描述这一项。在三引号内包含这个文档字符串,并将它放到项的后面,紧挨着它要描述的项
即使类中没有加入新的功能,也应该描述每个异常或类的用途。
在def 函数():后面使用三引号定义文档
在claa 类名:后面使用三引号定义文档
模块文档:在模块开始位置使用三引号文档字符串,放包含模块的文本文件的第一行。
文档内容:如何调用函数或方法,包括必要的参数和将要返回的数据类型。描述默认的参数值。
给定类的设计目的和用途。包括如何使用类的对象。
调用函数或方法的必备条件
类的运行带来的副作用或者导致系统的哪些方面发生变化。
可能发生的异常和导致异常发生的原因。
使用help(meal)查看模块的文档
>>> import food
>>> help(food)
Help on module food:
NAME
food
FUNCTIONS
favoriteFood()
FILE
e:pythonscriptfood.py
在调用help函数读入模块的文档之前,必须导入模块。
''' test doc
dddddd2
dddddd3'''
'''dddd4'''
def favoriteFood():
print("the only food worth eating is an omelet.")
>>> imp.reload(food)
>>> help(food)
Help on module food:
NAME
food
DESCRIPTION
test doc
dddddd2
dddddd3
FUNCTIONS
favoriteFood()
FILE
e:pythonscriptfood.py
7 测试模块
任何负责的模块都应该包含执行模块功能的测试函数。测试应该创建模块中定义的类的实例,并调用这些实例的方法。
将测试函数集成到模块中,这样测试将一直可用。
8 将模块作为程序运行
将python模块作为一个脚本运行:
if __name__=='__main__':
test()
""" module for making meals in python.
import this module and then call makeBreakfast(),makeDinner() or makeLunch()."""
__all__=["Meal","AngrychefException","makeBreakfast","makeLunch","makeDinner","Breakfast","Lunch","Dinner"]
#Helper functions.
def makeBreakfast():
'''Creates a Breakfast object.'''
return Breakfast()
def makeLunch():
'''creates a Lunch object.'''
return Lunch()
def makeDinner():
'''Creates a Dinner object .'''
return Dinner()
# Exception classes.
class SensitiveArtistException(Exception):
'''Exception raised by an overly-sensitive artist.
base class for artistic types.'''
pass
class AngryChefException(SensitiveArtistException):
'''Exception that indicates the chef is unhappy.'''
pass
class Meal:
'''Holds the food and drink used in a meal.
in true object-oriented tradition,this class includes setter methods for the food and dring.
call printId to pretty-print the values.'''
def __init__(self,food='omelet',drink='coffee'):
'''Initialize to default values.'''
self.name='generic meal'
self.food=food
self.drink=drink
def printIt(self,prefix=''):
'''print the data nicely.'''
print(prefix,' a fine ',self.name,' with ',self.food,' and ',self.drink)
#setter for the food
def setFood(self,food='omelet'):
self.food=food
#setter for drink
def setDrink(self,drink='coffee'):
self.drink=drink
#setter for the name.
def setName(self,name=''):
self.name=name
class Breakfast(Meal):
'''holds the food and drink for breakfast.'''
def __init__(self):
'''initialize with an omelet and coffee.'''
Meal.__init__(self,'omelet','coffee')
self.setName('breakfast')
class Lunch(Meal):
''' holds the food and drink for lunch'''
def __init__(self):
'''Initialize with a sandwich and a gin and tonic.'''
Meal.__init__(self,'sandwich','gin and tonic')
self.setName('midday meal')
#override setFood().
def setFood(self,food='sandwich'):
if food!='sandwich' and food !='omelet':
raise AngryChefException
Meal.setFood(self,food)
class Dinner(Meal):
'''holds the food and drink for dinner.'''
def __init__(self):
'''initialize with steak and merlot.'''
Meal.__init__(self,'steak','merlot')
self.setName('dinner')
def printIt(self,prefix=''):
'''print even more micely.'''
print(prefix,' a gourmet ',self.name,' with ',self.food,' and ',self.drink)
def test():
'''test function.'''
print('module meal test')
#generic no arguments.
print('testing meal class.')
m=Meal()
m.printIt(" ")
m=Meal('green eggs and ham ','tea')
m.printIt(" ")
#test breakfast
print('testing breakfast class.')
b=Breakfast()
b.printIt(" ")
b.setName('breaking of the fast')
b.printIt(" ")
#test dinner
print('testing dinner class.')
d=Dinner()
d.printIt(" ")
#test lunch
print('testing lunch class.')
l=Lunch()
l.printIt(" ")
print('Calling lunch.setFood().')
try:
l.setFood('hotdog')
except AngryChefException:
print(" ","the chef is angry,pick an omelet.")
# run test if this module is run as a program.
if __name__=='__main__':
test()
meal模块包含测试、文档、异常、类、函数
>>> import meal
>>> breakfast=meal.makeBreakfast()
>>> breakfast.printIt(" ")
a fine breakfast with omelet and coffee
>>> lunch=meal.makeLunch()
>>> try:
lunch.setFood('pancakes')
except meal.AngryChefException:
print("cannot make a lunch of pancakes")
cannot make a lunch of pancakes
>>> from meal import *
>>> dinner=makeDinner()
>>> dinner.printIt()
a gourmet dinner with steak and merlot
9 安装模块
python解释器在sys.path变量中列出的目录中查找模块。sys.path变量包括当前目录,所以总是可以使用当前路径中的模块。如果希望在多个脚本或者多个系统中使用您编写的模块,需要将它安装到sys.path变量列出的某个目录下。
大多数情况下,需要将python模块放到site-packages目录中。
1 添加setup.py 文件:
from distutils.core import setup
setup(name='meal',
version='1.0',
py_modules=['meal'],
)
2 将setup.py /meal.py文件放于 site-packages目录中
3 cmd 命令行转到site-packages 文件夹下 输入命令:python setup.py sdist 回车 在dist文件夹下生成:meal-1.0.tar.gz 单文件发布版本
5 安装:使用命令:python setup.py install
小结
模块就是python源文件。是可重用的代码片段,遵循规则:
为模块和模块中的所有类、方法和函数建立文件
测试模块并包含至少一个测试函数
定义要导出模块中的哪些项,包括哪些类或函数等
为使用模块时可能出现的问题创建需要的任何异常类
处理模块本身作为一个python脚本执行的情况
可以使用help 函数显示模块的文档 reload函数重新加载改变的模块
在创建了一个模块之后,可以使用 distutils创建一个模块 发布包,需要创建一个setup.py脚本
可以使用dir()函数浏览模块的属性,必须使用import语句导入后才可以使用。也可以使用 from module import item
python在特定的位置搜索模块文件。sys.path函数查看位置
面向对象编程由封装、继承、多态组成
使用三引号为模块中的对象创建文档,第一个三引号开始注释,第二个三引号结束注释
如果定义了__all__变量,可以列出组成模块的公有api的那些项:__all__=['','']
如果没有定义__all__变量,python解释器将查找名称不以下划线形如的所有项
在变量sys.path列出的目录中查询系统中模块的位置,需要首先导入 sys模块。
模块中可以放置任何python命令。模块可以包含python命令、python函数、python变量、python类等。但是在大多数情况下,应该避免在模块中运行命令。