python使用装饰器的一些总结
一、装饰器是什么
python的装饰器本质上是一个Python函数,它可以让其他函数在不需要做任何代码变动的前提下增加额外功能,装饰器的返回值也是一个函数对象。
有了装饰器,我们就可以抽离出大量与函数功能本身无关的雷同代码并继续重用。
概括的讲,装饰器的作用就是为已经存在的对象添加额外的功能。
二、我的使用场景
现有一个任务:需要写几个函数,每个函数针对一个网站去获取数据,然后把这些数据返回给其他系统。
获取数据就需要使用selenium来爬取数据。但打开浏览器,关闭浏览器,这些都是重复的操作,就可以使用一个装饰器来实现了。
三、实现代码
1 def driver_pro(func): 2 options = webdriver.ChromeOptions() 3 options.add_experimental_option('excludeSwitches', ['enable-automation']) # 禁用浏览器正在被自动化程序控制的提示,有用 4 options.add_experimental_option('useAutomationExtension', False) # 禁用 Chrome 的自动化扩展功能 5 def wrapper(*args, **kwargs): 6 driver = webdriver.Chrome(options=options) 7 driver.maximize_window() # 浏览器最大化显示 8 try: 9 result = func(driver, *args, **kwargs) # 调用函数,传入driver参数 10 finally: 11 driver.quit() 12 return result # 返回结果,如果调用此装饰器的函数有返回值,必须要增加这一步, 否则返回None 13 return wrapper
这个代码里面有3个地方需要注意的:
1. 第9行,调用此装饰器的时候,此装饰器会传入一个参数driver,直接给业务代码使用。
2. 第9行和12行,定义了一个result来接收调用函数的返回结果,并把这个返回结果返回。如果没有这样的步骤,其他地方调用业务函数的返回结果,会显示为None
3. 在第9行执行之前,打开了浏览器,在执行了业务函数后,第11行关闭了浏览器,这样就实现了浏览器的前后置操作。调用此装饰器的业务方,只需要关心业务实现即可。
三、装饰器的优点
装饰器其实是一个函数,作用是装饰其他函数。
优点1:不改变被装饰的函数的源代码的情况下添加函数的功能
优点2:不改变被装饰的函数的调用方式。
优点3:装饰器函数和被装饰函数分开,方便分开调试。
浙公网安备 33010602011771号