如果我们已经上线了一个项目,我们需要修改某一个方法,但是我们不想修改方法的使用方法,这个时候可以使用装饰器。因为软件的维护应该遵循开放封闭原则,即软件一旦上线运行后,软件的维护对修改源代码是封闭的,对扩展功能指的是开放的。
装饰器实现中必须遵循的两大原则: 封闭:对已经实现的功能代码块封闭,不修改被装饰对象的源代码开放:对扩展开发 装饰器其实就是在遵循以上两个原则的前提下为装饰对象添加新功能。装饰器的使用方法:@装饰器的使用名称装饰器:用来装饰函数或者类的工具。在不改变源代码的情况下给函数/类添加额外功能。 装饰器装饰的是函数或者类,所以需要传递的参数是函数名或者类名。
装饰器的模板 (1)先实现闭包 (2)要让这个装饰器可以装饰所有函数或者类(代表函数可以接受有参数和无参数) (3)如何让被装饰的函数保持自己原有的帮助信息。@wraps
import time from funtools import wraps #装饰器的定义 def timeit(f): @wraps(f)#装饰器用来保留f函数的原有属性,包括他的帮助信息 def wrapper (): f() #调用被装饰的函数 return result retuen wrapper #装饰器的调用 @timeit # 函数的定义 def f(x) # 函数的调用 f(x)requests下载:
pips install requests -i https://pypi.douban .com/simple这是一个练习: (1)定义一个函数:可以下载相应的文件 (2)添加装饰器,可以实现查看这个函数的运行时间
定义函数 import requests #http请求,多用于网络爬虫:就是下载一些东西 pip3 inatall 下载 def download() url=“地址” #要下载文件地址 response =requests.get (url) #模拟浏览器访问下载文件网址,获取服务区端给我们的响应(response) #download_content=response.content #获取下载文件的内容 with open (“文件名",'wb') as f: 打开文件,存储下载内容到文件中;w----是写的意思 b--是二进制的意思 f.write (response.content) print("download complete") #下载成功以后输出 download() #调用函数编以下函数,下载一首歌可正常运行
添加装饰器,可以查看运行时间练习: (1)定义一个加法函数 (2)加上装饰器查看运行时间
多个装饰器装饰的时候,从下到上进行装饰,执行的时候,从上到下进行执行。 练习:
try:-------except-------else-----finally-------
try: print("这段代码可能有问题") except IndexError as e: print("这段代码确实有问题") else: print("这段代码没有问题") finally: print("不管这段代码有没有问题,都要执行")正常执行:
异常执行: