服务器之家

服务器之家 > 正文

python 装饰器详解与应用范例

时间:2022-02-26 00:08     来源/作者:不侠居

什么是装饰器

从字面意思上来看,装饰器是用来装饰其他东西的工具。在python中装饰器分为函数装饰器和类装饰器。
简而言之,函数装饰器是用来装饰函数的装饰器,其主要目的是增加目标函数的功能,类装饰器也就是装饰类的装饰器,增加类的功能。

函数装饰器

装饰器本质是嵌套函数
下面是一个简单的装饰器

?
1
2
3
4
5
6
# fun1为装饰器名称,function指的是被装饰的函数
def fun1(function):
    def fun2():
        print("开始了!")
        function() # 执行被装饰的函数或者 或者 return function()
    return fun2

外面的fun1()需要传入一个参数,这个参数是用来传入要被装饰的函数,里面的fun2()需要执行function这个参数。
这是将函数当成参数传入另一个函数。

使用方法:
在需要装饰的函数上添加@装饰器名称

?
1
2
3
4
5
@fun1
def fun3():
    print("aaa")
 
fun3()

可以等价成这样:

?
1
2
3
4
def fun3():
    print("aaa")
fun = fun1(fun3)
fun()

输出结果是一致的

执行结果:

开始了!
aaa

如果传入的函数需要参数可以这样写:

?
1
2
3
4
5
6
7
8
9
10
def fun1(function):
    def fun2(a):
        print("开始了!")
        function(a)
    return fun2
 
@fun1
def fun3(a):
    print(a)
fun3("aaa")

输出结果:

开始了!
aaa

如果不清楚传入的函数需要多少个参数,可以这样写:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
def fun1(function):
    def fun2(*args, **kwargs):
        print("开始了!")
        function(*args, **kwargs)
    return fun2
 
@fun1
def fun3(a,b):
    print(a,b)
 
@fun1  
def fun4(a,b,c):
    print(a,b,c)
    
fun3("aaa","bbb")
fun4("ccc","ddd","eee")

运行结果:

开始了!
aaa bbb
开始了!
ccc ddd eee

如果函数装饰器需要添加参数,可以这样写:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
def fun(msg):
    def fun1(function):
        def fun2(*args, **kwargs):
            print("开始了!{}".format(msg))
            function(*args, **kwargs)
        return fun2
    return fun1
 
@fun(msg="小朋友")
def fun3(a,b):
    print(a,b)
 
fun3("aaa","bbb")

运行结果:

开始了!小朋友
aaa bbb

类装饰器

类装饰器的用法基本和函数装饰器一样,只不过是用类写的装饰器

?
1
2
3
4
5
6
7
8
9
10
11
12
13
class fun1(object):
    def __init__(self, func):
        self.func = func
 
    def __call__(self, *args, **kwargs):
        print(("开始了!")
        self.func(*args, **kwargs)
 
@fun1
def fun2(a,b):
    print(a,b)
 
fun2("aaa","bbb")

类装饰用到了类的__call__方法

运行结果:

开始了!
aaa bbb

还可以这样写:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
class fun(object):
    def __init__(self, msg):
        self.msg = msg
        
 
    def __call__(self, func):
        def fun1(*args, **kwargs):
            print("开始了!{0}".format(self.msg))
            func(*args, **kwargs)
        return fun1
 
@fun(msg="小朋友")
def fun2(a, b):
    print(a, b)
 
fun2("aaa,","bbb")

运行结果:

开始了!小朋友
aaa, bbb

到此这篇关于python 装饰器详解与应用范例的文章就介绍到这了,更多相关python 装饰器内容请搜索服务器之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持服务器之家!

原文链接:https://blog.csdn.net/m0_46778548/article/details/121011882

标签:

相关文章

热门资讯

2022年最旺的微信头像大全 微信头像2022年最新版图片
2022年最旺的微信头像大全 微信头像2022年最新版图片 2022-01-10
蜘蛛侠3英雄无归3正片免费播放 蜘蛛侠3在线观看免费高清完整
蜘蛛侠3英雄无归3正片免费播放 蜘蛛侠3在线观看免费高清完整 2021-08-24
背刺什么意思 网络词语背刺是什么梗
背刺什么意思 网络词语背刺是什么梗 2020-05-22
yue是什么意思 网络流行语yue了是什么梗
yue是什么意思 网络流行语yue了是什么梗 2020-10-11
2020微信伤感网名听哭了 让对方看到心疼的伤感网名大全
2020微信伤感网名听哭了 让对方看到心疼的伤感网名大全 2019-12-26
返回顶部