Python中的装饰器介绍

火山方舟向量数据库大模型

装饰器是Python编程语言中一种强大的特性,用于修改或增强函数或类的行为,而无需对它们本身进行修改。装饰器通常被用于在不改变原始代码的情况下,向函数或方法添加额外的功能,如日志记录、权限检查、数据格式转换等。装饰器本质上是一个函数,它接受一个函数作为参数,并返回一个经过修改的函数或可调用对象。

在装饰器的内部,您通常会定义一个新的函数,这个函数执行了装饰器所要添加的操作,然后调用原始函数,并返回其结果。这就是为什么装饰器的返回值通常是一个函数。

然后,通过使用 @装饰器函数名 语法将装饰器应用于其他函数或方法,使其成为经过装饰的版本。这样,当您调用经过装饰的函数时,实际上是调用了装饰器内部的新函数,从而实现了对原始函数的修改或增强。

一个简单的装饰器demo:

  
def my_decorator(func):  
 def wrapper():  
 print("函数调用前.")  
 func()  
 print("函数调用后.")  
 return wrapper  
  
@my_decorator  
def say_hello():  
 print("Hello,欢迎关注公众号#小博测试成长之路!")  
  
say_hello()  

picture.image

再看一下最近工作中写脚本,之前经常涉及到对字段进行一些额外的处理操作,比如两个字段值相加,但是源数据给的是字符串,这个时候就可以利用装饰器,对数据进行格式转换之后再操作:

  
def add_decorator_convert_int(func):  
 def wrapper(a, b):  
 result = func(int(a),int(b))  
 print(f"{a} + {b} = {result}")  
 return result  
 return wrapper  
  
@add_decorator_convert_int  
def add(a, b):  
 return a + b  
  
result = add(5, 3)  
result = add("5","3")  

picture.image

上面演示的是不带参数的装饰器,下面再来看看带参数的装饰器:

带参数的装饰器可以接收额外的参数,并在内部使用这些参数来定义装饰器的行为。这些参数可以在装饰器函数内部使用,以在调用原始函数之前或之后执行某些操作。

  
def validate_and_transform_data_format(data_type):  
 def decorator(func):  
 def wrapper(*args, **kwargs):  
 validated_args = []  
 for arg in args:  
 if isinstance(arg, data_type):  
 validated_args.append(arg)  
 else:  
 try:  
 validated_arg = data_type(arg)  
 validated_args.append(validated_arg)  
 except ValueError:  
 print(f"Invalid argument: {arg}. Skipping...")  
 return func(*validated_args, **kwargs)  
  
 return wrapper  
  
 return decorator  
  
  
@validate_and_transform_data_format(int)  
def calculate_sum(a, b, c):  
 return a + b + c  
  
  
result = calculate_sum("10", 20, "30")  
print("Result:", result)  
输出结果:Result: 60  

上面的代码,当调用 calculate_sum("10", 20, "30") 时,装饰器将会将字符串 "10" 和 "30" 转换为整数类型,然后执行函数并返回结果。

  
def with_parameters_decorator(arg1, arg2):  
 def inner_decorator(func):  
 def wrapper(*args, **kwargs):  
 # 在调用原始函数之前执行操作  
 print(f"函数{func.__name__}被调用前")  
 result = func(*args, **kwargs)  
 # 在调用原始函数之后执行操作  
 print(f"函数{func.__name__}被调用后")  
 return result  
 return wrapper  
 return inner_decorator  
  
@with_parameters_decorator("Hello", "World")  
def my_func():  
 print("被装饰器装饰的函数被调用啦")  
  
my_func()

picture.image

Python中的装饰器就先简单的介绍到这了,如果还不是很理解装饰器的用法,自己写不出来的话,可以复制文章中的案例依葫芦画瓢改一下试试。至于装饰器的一些其他应用场景啥的,只要代码写的足够多的时候,就会想着去进行优化,这个时候获取就能派上一些用场。

End

如果觉得文章对你有帮助的话,欢迎点赞转发~

如果还没有进粉丝交流群的小伙伴,赶快添加好友(xiaobotester)邀请你们进群喔。

👇👇👇

关注公众号,测试干货及时送达picture.image

为感谢所有粉丝的关注和长期以来的支持,特在公众号后台为大家准备了一些资料,可在后台回复【百宝箱/关键字】获取相关链接,资料会持续更新,有需要的可以先私聊作者补充文档。

picture.image

往期 精彩回顾

picture.image

如何打造一篇优秀的简历

混迹职场多年的你,面试真的准备好了吗?

你还在抱怨职场的不公吗?

职场篇-初入职场如何选择行业和公司

面试逻辑题分享--字母数字映射关系推算题

非技术性的面试中的技巧性回答集锦(建议收藏)

你的求职简历中招了吗?

测试编程笔试题No.1-输入表格列的英文名称,返回其对应的数字序号

软件测试面试题分享-No.1

软件测试面试题分享-No.2

软件测试面试题分享-No.3

软件测试面试题分享-No.4

软件测试面试题分享-No.5

软件测试面试题分享-No.6(某某某公司面试题)

软件测试面试题分享-No.7(接口自动化面试题)

xxx公司测试岗位企业面试题

picture.image

0
0
0
0
关于作者

文章

0

获赞

0

收藏

0

相关资源
vivo 容器化平台架构与核心能力建设实践
为了实现规模化降本提效的目标,vivo 确定了基于云原生理念构建容器化生态的目标。在容器化生态发展过程中,平台架构不断演进,并针对业务的痛点和诉求,持续完善容器化能力矩阵。本次演讲将会介绍 vivo 容器化平台及主要子系统的架构设计,并分享重点建设的容器化核心能力。
相关产品
评论
未登录
看完啦,登录分享一下感受吧~
暂无评论