模块
模块只是一个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()