python自己创建模块_python 创建模块 笔记

在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:\pythonscript\food.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:\pythonscript\food.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("\t")

m=Meal('green eggs and ham ','tea')

m.printIt("\t")

#test breakfast

print('testing breakfast class.')

b=Breakfast()

b.printIt("\t")

b.setName('breaking of the fast')

b.printIt("\t")

#test dinner

print('testing dinner class.')

d=Dinner()

d.printIt("\t")

#test lunch

print('testing lunch class.')

l=Lunch()

l.printIt("\t")

print('Calling lunch.setFood().')

try:

l.setFood('hotdog')

except AngryChefException:

print("\t","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("\t")

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 单文件发布版本

1327480-20191010145248342-2040796246.png

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类等。但是在大多数情况下,应该避免在模块中运行命令。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值