Python 装饰器

装饰器简述

装饰器(decorator),又称“装饰函数”,即一种返回值也是函数的函数,可以称之为“函数的函数”。其目的是在不对现有函数进行修改的情况下,实现额外的功能。最基本的理念来自于一种被称为“装饰模式”的设计模式。在 Python 中,装饰器属于纯粹的“语法糖”,不使用也没关系,但是使用的话能够大大简化代码,使代码更加易读。装饰器可以基于函数实现也可以基于类实现,两种实现的装饰器使用方法基本固定,使用装饰器步骤如下:

  1. 定义装饰函数(类)
  2. 定义业务函数
  3. 业务函数调用装饰函数

装饰器案例

案例1、不改动业务函数基础上增加新功能

复制代码
def decorator_demo1(func):
    '''装饰器函数'''

    def inner():
        func()
        print('这是添加的新功能!!!')

    return inner


# @decorator_demo1 等同与 f1 = decorator_demo1(f1)
@decorator_demo1
def f1():
    '''业务函数'''
    print('''This is f1()''')


@decorator_demo1
def f2():
    '''业务函数'''
    print('''This is f2()''')
复制代码

效果

This is f1()
这是添加的新功能!!!
This is f2()
这是添加的新功能!!!

Python 支持多个装饰器同时使用

复制代码
def decorator_demo01(func):
    '''装饰器1'''

    def inner():
        print('this is decorator_demo01')
        return f"<b> {func()} </b>"

    return inner


def decorator_demo02(func):
    '''装饰器2'''

    def inner():
        print('this is decorator_demo02')
        return f"<b> {func()} </b>"

    return inner


@decorator_demo01
@decorator_demo02
def f1():
    '''业务函数'''
    print("this is f1")
    return "hello world"


res = f1()
print(res)
复制代码

运行效果

this is decorator_demo01
this is decorator_demo02
this is f1
<b> <b> hello world </b> </b>

 案例2、带参装饰器

复制代码
def decorator_demo01(f1):
    '''装饰器'''
    print("-正在装饰-")

    def inner(a, b):
        print("正在验证")
        f1(a, b)

    return inner


@decorator_demo01
def f1(a, b):
    '''业务函数'''
    print(a + b)


f1(0, 5 )
复制代码

输出

-正在装饰-
正在验证
5

案例3、通用装饰器

复制代码
def decorator_demo01(func):
    '''装饰器'''

    def inner(*args, **kvargs):
        print('logging')
        res = func(*args, **kvargs)  # 保留返回数据
        return res  # 返回调用信息

    return inner

@decorator_demo01
def test1():
    '''无参函数'''
    print("this is test1 No args")

@decorator_demo01
def test2():
    '''无参函数'''
    print("this is test2 No args")
    return "This's test2 return info"

@decorator_demo01
def test3(info):
    '''无参函数'''
    print(f"this is test3 tith args {info}")



res1 = test1()
print(res1)

res2 = test2()
print(res2)

res3 = test3("hello test3")
print(res3)
复制代码

输出

复制代码
logging
this is test1 No args
None
logging
this is test2 No args
This's test2 return info
logging
this is test3 tith args hello test3
None
复制代码
posted @   晓枫的春天  阅读(35)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
点击右上角即可分享
微信分享提示