装饰器 Decorator
通常用来装饰函数,给被装饰函数增加或改变一点功能,而不需要更改被装饰函数的代码及功能
装饰器本身也是一种函数,需要先定义再使用。
特点是以@开头的字符串
装饰器最大的作用就是对于我们已经写好的程序,我们可以抽离出一些雷同的代码组建多个特定功能的装饰器,这样我们就可以针对不同的需求去使用特定的装饰器,这时因为源码去除了大量泛化的内容而使得源码具有更加清晰的逻辑
#e.g在原来的函数里加上一些文字
#定义装饰器endsign
def endsign(func): #func就是被装饰的函数对象,在本案例中为hello
def wrapper(): #定义装饰器后,第一步执行该函数
return func() + '!!' #第二步,去找func()函数,就是hello, 第四步拿到hello的返回值后,加上!!,再返回给wrapper
return wrapper #第五步,返回重新装饰过的函数
@endsign
def hello(): #第三步,被重新定义的函数,返回值给wrapper
return 'hello'
print(hello())
首先至少要有2个对象,装饰函数和被装饰函数,定义好装饰函数和需要装饰函数后,使用@装饰函数 在需要装饰函数的前面
执行调用的时候,就执行装饰函数
在本案里,@装饰函数相当于
def endsign(func):
def wrapper():
return func() + '!!'
return wrapper
def hello():
return 'hello'
newhello = endsign(hello)
print(newhello())
被装饰器的函数有参数
def endsign(func):
def wrapper(*args, **kwargs):
print('newarg1:', args)
print('newarg2:', kwargs)
return func(*args,**kwargs) + '!!'
return wrapper
@endsign
def hello(arg1, arg2=''):
print('arg1:',arg1)
print('arg2:',arg2)
return 'Hi, they are %s and %s' % (arg1,arg2)
print(hello('cat',arg2='dog'))
装饰器函数本身有参数
def endsign(tail): #tail 用来接收endsign里的参数
def innerOne(func): #只多了一层innerOne函数
def wrapper():
return '你好,' + func() + '' + tail
return wrapper
return innerOne
@endsign('!!??')
def hello():
return 'hello'
print(hello())