(六)函数----(四)
目录
6.1带参数的装饰器
def outer(f):
def inter(*args,**kwargs):
print('函数之前')
ret = f(*args,**kwargs)
print('函数之后')
return ret
return inter
@outer #f = outer(f)
def f(s):
print('hello python')
return '你好%s'%s
@outer
def f(s):
print('hello python')
return '你好%s'%s
print(f('同学'))
print(f('铁头'))
如果想关闭装饰器,只打印原函数内容,需要定义一个带参数的装饰器
flag控制开关
flag = False
def out(i):
def outer(f):
def inter(*args,**kwargs):
if i:
print('函数之前')
ret = f(*args,**kwargs)
print('函数之后')
return ret
else:
ret = f(*args, **kwargs)
return ret
return inter
return outer
@out(flag) #outer = out(flag) f = outer(f)
#outer = out(False)
#@out
def f(s):
print('hello python')
return '你好%s'%s
@out(flag)
def f(s):
print('hello python')
return '你好%s'%s
print(f('同学'))
print(f('铁头'))
6.2多个装饰器装饰一个函数
#多个装饰器装饰一个函数
def outer1(f): #outer1(ff) #1
def iner1(): #4
print('1111前') #15
ret = f() #16
print('1111后') #17
return iner1 #5
def outer2(f): #outer(iner1) #2
def iner2(): #8
print('2222前') #13
ret = f() #14
print('2222后') #18
return iner2 #9
@outer2 #7#10 ff = outer2(ff) ==> outer2(iner1) =iner2 (2)
@outer1 #3#6 ff = outer1(ff) = iner1 (1)因为@要找一个紧挨着的函数才能执行
def ff():
print('hi 铁头') #12
return 'hi' #19
print(ff()) #11 实际调用的是iner2
'''
2222前
1111前
hi 铁头
1111后
2222后
hi
'''
6.3补充:wraps
from functools import wraps
def wrappe(f):
@wraps(f)
def inner(*args,**kwargs):
print('装饰器之前打印')
ret = f(*args,**kwargs)
print('装饰器之后打印')
return ret
return inner
@wrappe #f = wrappe(f)
def f(a):
'''
你好
:param f:
:return:
'''
print('hello python')
return '%s'%a
ret = f(1)
print(ret)
print(f.__name__)#查看字符串的函数名 打印的是inner
print(f.__doc__) #查看注释
# def f1():
# '''
# 你好
# :return:
# '''
# print('hello')
# print(f1.__name__)#查看字符串的函数名
# print(f1.__doc__)#查看注释