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)

 

posted @ 2021-08-26 14:29  admin-xiaoli  阅读(46)  评论(0编辑  收藏  举报