python装饰器两层和三层_学习python的第十五天(函数的装饰器,两层装饰器和三层装饰器)...

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()

#他是对于输入的值的一层装饰,判断他是拿来的

`

原文地址:https://www.cnblogs.com/pythonywy/p/10960572.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值