Python函数的装饰器,两层装饰器和三层装饰器
一.装饰器
1.函数装饰圈的定义
函数装饰器:一种装饰函数的函数
2.个人理解两层函数装饰器
两层函数装饰器个人觉得他其实就是把需要装饰的函数名丢入形参,然后用一个嵌套的函数对其头尾进行添加程序,但是不能减少他的程序内容,他的原来程序不变只能增不能减少,然后返回装饰好的子函数,再全局定义一个变量名与要装饰的函数名相同名字,并且将装饰后的函数调用赋予改变量.
1.简单的例子(无参函数)
如
#有个函数f1
def f1():
print('nick machachong')
#我们要对齐装饰使其输出打印内容上下都加了'-'线
def f1_deco(f1): #第一步吧变量丢进去
def wrapper():
#print(50*'-') #我们加的内容
#print('nick machachong') #这个等同于f1()
#print(50*'-') #我们要加的内容
#这是我们需要的打印效果
pritn(50*'-')
f1()
print(50*'-')
return wrapper
f1 = f1_deco(f1) #前面的f1是变量f1,函数本是f1并未发生变化只是一个变量名接受了f1
f1()
```
--------------------------------------------------
nick machachong
--------------------------------------------------
```
#另外种写法
@f1_deco
def f1():
print('nick machachong')
f1()
```
--------------------------------------------------
nick machachong
--------------------------------------------------
```
2.关于有参函数
'''
遇到问题没人解答?小编创建了一个Python学习交流QQ群:579817333
寻找有志同道合的小伙伴,互帮互助,群里还有不错的视频学习教程和PDF电子书!
'''
#如函数
def sum(x,y):
print(x+y)
#我们要对齐装饰使其输出打印内容上下都加了'-'线
def sum_deco(sum):
def wrapper(x,y):
print("-")
sum(x,y)
return sum
sum() = sum_deco(sum)
sum(x,y)
#多个值
def sb(x,y,z=2,b=1):
print(x,y,z,b)
#把他进行封装
def sb_deco(sb):
def wrapper(*args,**kwargs):
print('nick machachong')
sb(*args,**kwargs)
return wrapper
sb = sb_deco(sb)
sb(1,23,2,3)
3.对于有返回值的函数式
#有返回值
def sb(x,y,z=2,b=1):
return x,y,z,b
#对于返回值乘以3
def sb_deco(sb):
def wrapper(*args,**kwargs):
res = sb(*args,**kwargs)
res = list(res)
for a in range(len(res)):
res[a] = 3*res[a]
res = tuple(res)
return res
return wrapper
sb = sb_deco(sb)
print(sb(2,3,4,5))
4.装饰圈模板
'''
遇到问题没人解答?小编创建了一个Python学习交流QQ群:579817333
寻找有志同道合的小伙伴,互帮互助,群里还有不错的视频学习教程和PDF电子书!
'''
def sb(*args,**kwargs):
pass
#装饰器模板
def sb_deco(sb):
def wrapper(*args,**kwargs):
#sb(*args,**kwargs)
res = sb(*args,**kwargs) #赋值的时候已经开始调用了所有没必要在写一步调用
return res
return wrapper
sb = sb_deco(sb)
sb(1,23,2,3,12,312,312,3,123)
3.对于三层装饰器理解
#比如说一个函数为,我们对齐装饰,打印内容前后上下加'-'
def sb():
print('i am sb')
#装饰
def sb_deco(sb):
def wrapper():
print('-'*5)
sb()
print('-'*5)
return wrapper
#只时候我们加条件要区分是你输入还是我输入的
# 只时候我们加条件要区分是你输入还是我输入的, 我那边聪明肯定不是SB
def sb_deco(sb):
def wrapper():
if user == 'you':
print('-' * 5)
sb()
print('-' * 5)
elif user == 'i':
print('-' * 5)
sb()
print('这是不可能的')
print('-' * 5)
return wrapper
#这时候我们导入的参数多了个user
def user(user):
def sb_deco(sb):
def wrapper():
if user == 'you':
print('-' * 5)
sb()
print('-' * 5)
elif user == 'i':
print('-' * 5)
sb()
print('这是不可能的')
print('-' * 5)
return wrapper
return sb_deco
@user('you') #其中@user('you') 相当于a =user('you') sb = a(sb)
def sb():
print('i am sb')
sb()
#他是对于输入的值的一层装饰,判断他是拿来的