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

  • 相关阅读:
    剑指 Offer 51. 数组中的逆序对
    剑指 Offer 68
    剑指 Offer 68
    JS绑定事件三种方式
    图片懒加载原理及实现
    资源加载过程
    了解JS单线程和任务队列!
    JS函数作用域提升
    JS函数种类详解
    ES6之模版字符串
  • 原文地址:https://www.cnblogs.com/caojuansh/p/11636780.html
Copyright © 2020-2023  润新知