什么是装饰器
从字面意思上来看,装饰器是用来装饰其他东西的工具。在python中装饰器分为函数装饰器和类装饰器。 简而言之,函数装饰器是用来装饰函数的装饰器,其主要目的是增加目标函数的功能,类装饰器也就是装饰类的装饰器,增加类的功能。
函数装饰器
装饰器本质是嵌套函数 下面是一个简单的装饰器
def fun1(function):
def fun2():
print("开始了!")
function()
return fun2
外面的fun1() 需要传入一个参数,这个参数是用来传入要被装饰的函数,里面的fun2() 需要执行function 这个参数。 这是将函数当成参数传入另一个函数。
使用方法: 在需要装饰的函数上添加@装饰器名称
@fun1
def fun3():
print("aaa")
fun3()
可以等价成这样:
def fun3():
print("aaa")
fun = fun1(fun3)
fun()
输出结果是一致的
执行结果:
开始了!
aaa
如果传入的函数需要参数可以这样写:
def fun1(function):
def fun2(a):
print("开始了!")
function(a)
return fun2
@fun1
def fun3(a):
print(a)
fun3("aaa")
输出结果:
开始了!
aaa
如果不清楚传入的函数需要多少个参数,可以这样写:
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
如果函数装饰器需要添加参数,可以这样写:
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
类装饰器
类装饰器的用法基本和函数装饰器一样,只不过是用类写的装饰器
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
还可以这样写:
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
|