什么是装饰器
从字面意思上来看,装饰器是用来装饰其他东西的工具。在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