2021-08-26 Python之装饰器
#装饰器 @property
1 class student: 2 def __init__(self,name,age): 3 self.name=name 4 self.__age=age 5 #先有get 6 @property 7 def age(self): 8 return self.__age 9 #再有set 10 @age.setter 11 def age(self,age): 12 if age>0 and age<100: 13 self.__age=age 14 else: 15 print('不在规定的范围内') 16 17 def __str__(self): 18 return '年龄:{},姓名:{}'.format(self.name,self.__age) 19 20 s=student('xixi',14) 21 s.name='xixixi' 22 print(s.name) 23 24 s.age=15 25 print(s.age)
#装饰器
'''
加入购物车,付款,修改地址
判断用户登陆状态
'''
1 def func(num): 2 a=10 3 4 def in_func(): 5 nonlocal a 6 nonlocal num 7 num+=1 8 9 for i in range(num): 10 a+=2 11 print('修改后a:',a) 12 return in_func 13 14 f=func(5) 15 f()
1 #函数作为参数 2 ''' 3 a=2 4 f1=func(a) 5 print(f1) 6 ''' 7 8 #地址引用 9 ''' 10 def test(): 11 print('---------test----------') 12 t=test 13 14 test() 15 t() 16 17 def func(f): #f=test 18 print(f) 19 f() 20 print('--->func') 21 22 func(test)
#装饰器特点:
#函数A是作为参数出现的,函数B就接收函数A作为参数
#要有闭包的特点
#定义装饰器
1 def decorate(func): 2 a=2 3 def wrapper(): 4 func() 5 print('--->刷漆') 6 print('--->铺地板',2) 7 return wrapper 8 #使用装饰器 9 @decorate 10 def house(): 11 print('毛坯房') 12 house()
#把被装饰函数house,作为参数传给装饰器,执行decorate函数
#将返回值又赋值给house
#校验登录模拟
1 import time 2 def decorate(func): 3 def wrapper(*args,**kwargs): #可以装所有类型的参数 4 print('正在校验中……') 5 time.sleep(2) 6 print('校验完毕……') 7 8 func(*args,**kwargs) 9 return wrapper 10 11 @decorate 12 def f1(n): 13 print('------success-----',n) 14 f1(5) 15 16 @decorate 17 def f2(name,age): 18 print('--------go---------',name,age) 19 f2('lilty',13) 20 21 @decorate 22 def f3(students,clazz='1940'): 23 print('{}班的学生如下:'.format(clazz)) 24 for stu in students: 25 print(stu) 26 students=['lily','tonm','jiahu'] 27 f3(students)
#如果是多层的装饰器,谁距离函数最近就优先使用哪个装饰器
1 def z1(func): 2 print('刷漆') 3 def wrapper(*args,**kwargs): 4 func() 5 print('刷漆进行中') 6 print('刷漆完成') 7 return wrapper 8 9 def z2(func): 10 print('装门') 11 def wrapper(*args,**kwargs): 12 func() 13 print('装门进行中') 14 print('装门完成') 15 return wrapper 16 17 @z1 18 @z2 19 def house(): 20 print('毛坯房') 21 house()
#装饰器带参数
'''
带参数的装饰器是三层的
最外层的函数负责接收装饰器参数
里面的内容还是装饰器的内容
'''
1 def outer(a): #第一层:负责接收装饰器的参数 2 def decorate(func): #第二层:接收函数的参数 3 def wrapper(*args,**kwargs): #第三层:接收函数的参数 4 func(*args) 5 print('--->铺地砖{}块'.format(a)) 6 return wrapper 7 return decorate 8 9 @outer(10) 10 def house(time): 11 print('我{}拿到房子钥匙,是毛坯房'.format(time)) 12 house('2017-5-8')
#装饰器的应用:
#开发:登录验证
1 import time 2 3 islogin=False 4 #定义登录函数 5 def login(): 6 username=input('输入用户名:') 7 password=input('输入密码:') 8 if username == 'adm' and password == '123': 9 return True 10 else: 11 return False 12 13 14 15 #定义一个装饰器 16 def login_require(func): 17 def wrapper(*args,**kwargs): 18 global islogin 19 print('--------付款--------') 20 if islogin: 21 func(*args,**kwargs) 22 else: 23 print('用户没有登录,不能付款') 24 islogin=login() 25 print('result:',islogin) 26 27 return wrapper 28 29 30 @login_require 31 def pay(money): 32 print('正在付款,付款金额是:{}元'.format(money)) 33 print('付款中……') 34 time.sleep(2) 35 print('付款完成') 36 37 pay(1000) 38 pay(599999999)
本文来自博客园,作者:{admin-xiaoli},转载请注明原文链接:{https://www.cnblogs.com/crackerroot}
分类:
Python
标签:
Python之装饰器
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 提示词工程——AI应用必不可少的技术
· Open-Sora 2.0 重磅开源!
· 周边上新:园子的第一款马克杯温暖上架