学习python的第十五天(函数的装饰器,两层装饰器和三层装饰器)
程序员文章站
2022-11-24 09:36:05
06.01自我总结 一.装饰器 1.函数装饰圈的定义 函数装饰器:一种装饰函数的函数 2.个人理解两层函数装饰器 两层函数装饰器个人觉得他其实就是把需要装饰的函数名丢入形参,然后用一个嵌套的函数 进行添加程序,但是不能减少他的程序内容,他的原来程序不变只能 ,然后返回装饰好的子函数,再全局定义一个变 ......
06.01自我总结
一.装饰器
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.关于有参函数
#如函数 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.装饰圈模板
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() #他是对于输入的值的一层装饰,判断他是拿来的
`