python装饰器decorator的应用

python中的装饰器类似于java中的AOP切面编程的思想,下面通过demo教大家如何实现

(1)一个最简单的装饰器 demo1

 

1
2
3
4
5
6
7
8
9
10
11
12
13
#一个最简单的装饰器
def my_decorator(func):
    def wrapper():
        print("Something is happening before the function is called.")
        func()
        print("Something is happening after the function is called.")
    return wrapper
 
@my_decorator
def say_hello():
    print("Hello!")
 
say_hello()

 

 结果:

Something is happening before the function is called.
Hello!
Something is happening after the function is called.

 

(2)装饰器中如何传递函数中的参数 demo2

1
2
3
4
5
6
7
8
9
10
11
12
13
14
#装饰器中如何传递函数中的参数
def my_decorator(func):
    def wrapper(*args, **kwargs):
        print("Something is happening before the function is called.")
        result = func(*args, **kwargs)
        print("Something is happening after the function is called.")
        return result
    return wrapper
 
@my_decorator
def greet(name):
    print(f"Hello, {name}!")
 
greet("Alice")

 结果:

Something is happening before the function is called.
Hello, Alice!
Something is happening after the function is called.

(3)多个装饰器 demo3

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#多个装饰器
def decorator1(func):
    def wrapper(*args, **kwargs):
        print("Decorator 1")
        return func(*args, **kwargs)
    return wrapper
 
def decorator2(func):
    def wrapper(*args, **kwargs):
        print("Decorator 2")
        return func(*args, **kwargs)
    return wrapper
 
@decorator1
@decorator2
def say_hi():
    print("Hi!")
 
say_hi()

 结果:

Decorator 1
Decorator 2
Hi!

(4)当作注解,使用 @装饰器名(装饰器参数) 绑定到函数上 demo4

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
#conding=utf-8
 
#给装饰器 传递参数
 
def decorator(arg_1, arg_2):
    """
    装饰器是一个自定义函数,可以接收我们指定的参数,
    其内部内嵌了两层函数,用于接收函数本身和函数参数.
    因此我们有两种使用装饰器的方法:(该样例使用第一种)
    ① 当作注解,使用 @装饰器名(装饰器参数) 绑定到函数上
    ② 当作函数,使用 装饰器名(装饰器参数)(函数名)(函数参数) 来一次性调用
    我们在装饰器内部拿到了函数和其参数,因此有较大的自由度可以决定如何调用目标函数。
    """
    def wrapper(func):
        def func_wrapper(*args, **kw):
 
            print(func.__name__)
            print(f"装饰器参数1: {arg_1}, 装饰器参数2: {arg_2}")
            print("执行函数前做点什么")
 
            result = func(*args, **kw)
 
 
            print("执行函数后做点什么")
            print(f"目标函数运行返回值:{result}")
            return result
 
        return func_wrapper
 
    return wrapper
 
 
# 加法函数
@decorator("参数1", "参数2")
def add(arg_1: int, arg_2: int):
    print(f"目标函数开始执行, 函数参数为: {arg_1},{arg_2}")
    return arg_1 + arg_2
 
 
 
if __name__ == '__main__':
    print("=" * 10)
    # 绑定注解形式调用
    add(3, 5)

 结果:

==========
add
装饰器参数1: 参数1, 装饰器参数2: 参数2
执行函数前做点什么
目标函数开始执行, 函数参数为: 3,5
执行函数后做点什么
目标函数运行返回值:8

(5)当作函数,使用 装饰器名(装饰器参数)(函数名)(函数参数) 来一次性调用 demo5

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
#conding=utf-8
 
#给装饰器 传递参数
 
def decorator(arg_1, arg_2):
    """
    创建装饰器。
    装饰器是一个自定义函数,可以接收我们指定的参数,
    其内部内嵌了两层函数,用于接收函数本身和函数参数.
    因此我们有两种使用装饰器的方法:(该样例使用第二种)
    ① 当作注解,使用 @装饰器名(装饰器参数)  绑定到函数上
    ② 当作函数,使用 装饰器名(装饰器参数)(函数名)(函数参数) 来一次性调用
    我们在装饰器内部拿到了函数和其参数,因此有较大的自由度可以决定如何调用目标函数。
    """
    def wrapper(func):
        def func_wrapper(*args, **kw):
 
            print(func.__name__)
            print(f"装饰器参数1: {arg_1}, 装饰器参数2: {arg_2}")
            print("执行函数前做点什么")
 
            result = func(*args, **kw)
 
 
            print("执行函数后做点什么")
            print(f"目标函数运行返回值:{result}")
            return result
 
        return func_wrapper
 
    return wrapper
 
 
# 加法函数
@decorator("参数1", "参数2")
def add(arg_1: int, arg_2: int):
    print(f"目标函数开始执行, 函数参数为: {arg_1},{arg_2}")
    return arg_1 + arg_2
 
 
 
if __name__ == '__main__':
    print("=" * 10)
    # 绑定注解形式调用
    # 一次性调用
    decorator("参数_1", "参数_2")(add)(3,5)

 结果:

==========
func_wrapper
装饰器参数1: 参数_1, 装饰器参数2: 参数_2
执行函数前做点什么
add
装饰器参数1: 参数1, 装饰器参数2: 参数2
执行函数前做点什么
目标函数开始执行, 函数参数为: 3,5
执行函数后做点什么
目标函数运行返回值:8
执行函数后做点什么
目标函数运行返回值:8

(6)类装饰器 demo6

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#conding=utf-8
 
#类装饰器
class MyDecorator:
    def __init__(self, func):
        self.func = func
 
    def __call__(self, *args, **kwargs):
        print("Something is happening before the function is called.")
        result = self.func(*args, **kwargs)
        print("Something is happening after the function is called.")
        return result
 
@MyDecorator
def say_goodbye():
    print("Goodbye!")
 
say_goodbye()

 结果:

Something is happening before the function is called.
Goodbye!
Something is happening after the function is called.

 

 源码获取方式(免费):
(1)登录-注册:http://resources.kittytiger.cn/
(2)搜索:python装饰器decorator的应用

posted @   万笑佛  阅读(25)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!
点击右上角即可分享
微信分享提示