Python笔记--创建模块

模块

模块只是一个Python源文件,它可以包含变量、类、函数和Python脚本中可用到的其他任何元素。

在使用一个模块之前需要先导入它

>>> import module

也可以仅导入需要的一个类或函数

>>> from module import item

如果一个模块被修改了,可以使用imp.reload函数重新加载该模块的新定义。

>>> import module
>>> import imp
>>> imp.reload(module)

查找模块

对于一个模块,Python解释器首先查找一个称为module.py的文件。module是传递给import语句的模块的名称。

当找到该模块时,Python解释器将它编译成一个.pyc文件。当再次导入模块时,Python解释器可以加载编译好的模块,加

速Python脚本的运行。

Python是一个开源包,所以可以得到Python解释器和所有模块的源代码。在sys.path列出的所有目录中查找以.py结尾的文件,这些

文件就是Python模块。一些模块只包含函数,而一些则包含类和函数。

>>> import sys
>>> print(sys.path)
['', 'D:\\ANCONDA\\python38.zip', 'D:\\ANCONDA\\DLLs', 'D:\\ANCONDA\\lib', 'D:\\ANCONDA', 'D:\\ANCONDA\\lib\\site-packages', 'D:\\ANCONDA\\lib\\site-packages\\locket-0.2.1-py3.8.egg', 'D:
\\ANCONDA\\lib\\site-packages\\win32', 'D:\\ANCONDA\\lib\\site-packages\\win32\\lib', 'D:\\ANCONDA\\lib\\site-packages\\Pythonwin']

创建模块和包

模块只是一个Python源文件,实际上,创建一个python文件的时候就是在创建一个模块。

food.py

def favouriteFood():
    print("my favourite is ")
>>> import food
>>> dir(food)
['__builtins__', '__cached__', '__doc__', '__file__', '__loader__', '__name__', '__package__', '__spec__', 'favouriteFood']
>>> food.favouriteFood()

如果不使用模块前缀会出现错误。

>>> favouriteFood()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
NameError: name 'favouriteFood' is not defined

如果单独导入该函数可以解决这个问题。

>>> from food import favouriteFood
>>> favouriteFood()

 

使用类

大多数模块定义了一个相关的函数或类的集合。类保存数据和操作数据的方法。

面向对象编程:封装、继承、多态

封装:一个类能够隐藏执行某个任务所需的内部细节和数据。

继承:一个类可以继承并且访问父类中定义的数据和方法。

多态:子类可以重写方法来完成更特殊的行为。

创建类

class Meal:
    def __init__(self, food="omelet", drink="coffee"):
        self.name = 'generic meal'
        self.food = food
        self.drink = drink

    def printIt(self, prefix=""):
        print(prefix, 'A fine', self.name, 'with', self.food, 'and', self.drink)

    def setFood(self, food='omelet'):
        self.food = food

    def setDrink(self, drink='coffee'):
        self.drink = drink

    def setName(self, name=''):
        self.name = name

扩展已有的类

在定义一个类之后,可以通过定义子类来扩展它。

class Breakfast(Meal):
    def __init__(self):
        Meal.__init__(self, food='omelet', drink='coffee')
        self.setName(name='Breakfast')

class Lunch(Meal):
    def __init__(self):
        Meal.__init__(self, 'sandwich', 'gin and tonic')
        self.setName('middy meal')

    # Override setFood()
    def setFood(self, food='sandwich'):
        if food != 'sandwich' and food != 'omelet':
            Meal.setFood(self, food)

class Dinner(Meal):
    def __init__(self):
        Meal.__init__(self, food='steak', drink='merlot')
        self.setName('dinner')

    def printIt(self, prefix=""):
        print(prefix, 'A gourmet', self.name, 'with', self.food, 'and', self.drink)

 

完成模块

定义模块的特定错误,meal类的异常可用定义如下。

class SensitiveArtistException(Exception)
     pass

选择导出哪些内容

from meal import *

代表从模块中到处所有的公有项。Python解释器使用两种方法确定哪些是公有的。

如果模块中定义了变量_all_,解释器使用_all_确定哪些是公有项。

如果模块中没有定义变量_all_,解释器会导入除了以下划线(_)开头的项目之外的所有项。

_all_ = {'Meal', 'AngryChefException', 'makeBreakfast', 'makeLunch', 'makeDinner', 'Breakfast', 'Lunch', 'Dinner'}

 

为模块建立文档

可以将其理解为注释。最基本的要求是,对于要写入文档的每一项,都要写一个文档字符串来描述这一项。

在三个引号内包含这个文档字符串,并将它放到项的后面,紧挨着它描述的项。

使用help函数可浏览编写的文档。

>>> import food
>>> help(food)

测试模块

测试一个模块可以验证它是否能工作。

def test():
    """
    Test function
    :return:
    """
    print("Module food test")

    print("Testing Meal class")
    m = Meal()
    m.printIt("\t")

    m = Meal('green eggs and ham', 'tea')
    m.printIt("\t")

    print("Testing Breakfast class")
    b = Breakfast()
    b.printIt("\t")

    b.setName("breaking of the fast")
    b.printIt("\t")

将模块作为程序运行

if __name__ == '__main__':
    test()

 

posted @ 2021-08-29 00:12  奋斗的小仔  阅读(243)  评论(0编辑  收藏  举报