前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Python中的装饰器介绍

Python中的装饰器介绍

作者头像
小博测试成长之路
发布2023-09-01 08:32:36
2190
发布2023-09-01 08:32:36
举报
文章被收录于专栏:软件测试学习

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

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

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

一个简单的装饰器demo:

代码语言:javascript
复制
def my_decorator(func):
    def wrapper():
        print("函数调用前.")
        func()
        print("函数调用后.")
    return wrapper

@my_decorator
def say_hello():
    print("Hell")

say_hello()

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

代码语言:javascript
复制
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")

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

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

代码语言:javascript
复制
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" 转换为整数类型,然后执行函数并返回结果。

代码语言:javascript
复制
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()

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

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2023-08-27,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 小博测试成长之路 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档