金天牛

导航

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:装饰器函数和被装饰函数分开,方便分开调试。

posted on 2025-04-03 17:27  金天牛  阅读(25)  评论(0)    收藏  举报