Python装饰器是高阶函数,用于在不修改代码的情况下扩展或修改函数行为。它们提供可重用性、模块化和无侵入性的功能增强。

简介: 【6月更文挑战第20天】Python装饰器是高阶函数,用于在不修改代码的情况下扩展或修改函数行为。它们提供可重用性、模块化和无侵入性的功能增强。例如,`@simple_decorator` 包装`my_function`,在调用前后添加额外操作。装饰器还能接受参数,如`@logged("INFO", "msg")`,允许动态定制功能。

装饰器(Decorator)是 Python 中一种强大的工具,它允许我们在不修改源代码的情况下扩展或修改函数、类等对象的行为。装饰器本质上是一个接收一个函数作为参数并返回一个新的函数的高阶函数。

功能:

  1. 可重用性:装饰器提供了在多个函数上应用相同行为的一种方式,比如添加日志、性能分析、权限控制等。
  2. 模块化:通过将装饰器定义为独立的函数或类,可以将相关的功能封装在一起,提高代码的组织性和可读性。
  3. 无侵入性:装饰器不会改变原始函数的名称和元信息,对调用者来说透明。

用法:

装饰器的语法糖使得使用它们变得非常直观和简洁。以下是装饰器的基本用法:

# 定义一个简单的装饰器
def simple_decorator(func):
    def wrapper(*args, **kwargs):
        print("Before function call")
        result = func(*args, **kwargs)
        print("After function call")
        return result
    return wrapper

# 使用装饰器来包装函数
@simple_decorator
def my_function():
    print("Function body")

# 调用函数
my_function()

在这个例子中,simple_decorator 是一个装饰器函数,它接收一个函数 func 作为参数,并返回一个新的函数 wrapper。当我们在 my_function 上使用 @simple_decorator 装饰器时,实际上是用 wrapper 函数替换了原来的 my_function。因此,当我们调用 my_function() 时,实际上执行的是 wrapper(),这会导致在调用前后打印出相应的消息。

除了这个基本的用法,装饰器还可以接受参数,以便提供更灵活的功能。例如,下面是一个带有参数的装饰器示例:

from functools import wraps

def logged(level, message=""):
    def decorator(func):
        @wraps(func)
        def wrapper(*args, **kwargs):
            print(f"{level}: {message} - Before function call")
            result = func(*args, **kwargs)
            print(f"{level}: {message} - After function call")
            return result
        return wrapper
    return decorator

@logged("INFO", "Performing calculation")
def calculate(x, y):
    return x + y

result = calculate(3, 4)
print(result)  # 输出:
# INFO: Performing calculation - Before function call
# 7
# INFO: Performing calculation - After function call

在这个例子中,logged 装饰器接受两个参数 levelmessage,并在装饰函数时传入这些值。这样,我们可以在不同的地方使用同一个装饰器,但可以根据需要定制其行为。

相关文章
|
4月前
|
存储 JavaScript Java
(Python基础)新时代语言!一起学习Python吧!(四):dict字典和set类型;切片类型、列表生成式;map和reduce迭代器;filter过滤函数、sorted排序函数;lambda函数
dict字典 Python内置了字典:dict的支持,dict全称dictionary,在其他语言中也称为map,使用键-值(key-value)存储,具有极快的查找速度。 我们可以通过声明JS对象一样的方式声明dict
343 2
|
4月前
|
算法 Java Docker
(Python基础)新时代语言!一起学习Python吧!(三):IF条件判断和match匹配;Python中的循环:for...in、while循环;循环操作关键字;Python函数使用方法
IF 条件判断 使用if语句,对条件进行判断 true则执行代码块缩进语句 false则不执行代码块缩进语句,如果有else 或 elif 则进入相应的规则中执行
601 1
|
4月前
|
Java 数据处理 索引
(numpy)Python做数据处理必备框架!(二):ndarray切片的使用与运算;常见的ndarray函数:平方根、正余弦、自然对数、指数、幂等运算;统计函数:方差、均值、极差;比较函数...
ndarray切片 索引从0开始 索引/切片类型 描述/用法 基本索引 通过整数索引直接访问元素。 行/列切片 使用冒号:切片语法选择行或列的子集 连续切片 从起始索引到结束索引按步长切片 使用slice函数 通过slice(start,stop,strp)定义切片规则 布尔索引 通过布尔条件筛选满足条件的元素。支持逻辑运算符 &、|。
287 0
|
Linux Python
【Python】300行代码实现crontab定时器功能 【上】
熟悉Linux的都知道在Linux下有一个crontab的定时任务,可以很方便的进行各种定时、计划任务的执行。有时候写代码也需要用到定时器业务,因此我使用Python实现了一个类似的定时器模块,可以很方便的做定时业务,使用例子如下:
580 0
【Python】300行代码实现crontab定时器功能 【上】
|
Python
使用python实现一个文件搜索功能,类似于Everything功能
一般人日常总是会将一些片段信息记录到文件中,放到电脑硬盘上。等过段时间,可能就不知道放到哪里了,电脑上文件夹太多。 找文件一般都会借助于搜索软件,比如Everything软件就很强大,输入名称,就能全局查找文件;
830 0
|
机器学习/深度学习 人工智能 索引
一行Python可以实现的功能
手头有 109 张头部 CT 的断层扫描图片,我打算用这些图片尝试头部的三维重建。基础工作之一,就是要把这些图片数据读出来,组织成一个三维的数据结构(实际上是四维的,因为每个像素有 RGBA 四个通道)。

推荐镜像

更多