Python学习-装饰器

装饰器

 

 由于函数也是一个对象,函数对象可以赋值给一个变量,所以,通过变量也可以调用该函数。

有一个函数我们想要增强它的功能,又不想修改函数的定义,这种在代码运行期间动态增加功能的方式,叫装饰器。

 比如:有一个视频网站,有首页,看电视剧,看综艺,看新闻几个功能

 1 def home():
 2     print('首页')
 3 def zy():
 4     print('综艺')
 5 def dsj():
 6     print('电视剧')
 7 
 8 home()
 9 
10 zy()
11 
12 dsj()

如果这时候我们想增加功能,需要用户登录后才能观看视频,我们在不修改函数定义和不改变函数调用方式时可以这样做

 1 user_state = False
 2 def login(func):
 3     def inner():
 4         _username = abc
 5         _password = 123
 6         global user_state
 7 
 8         if user_state == False:
 9             username = input('用户名')
10             password = input('密码')
11 
12             if username == _username and password == _password:
13                 user_state = True
14                 print('登录成功')
15             else:
16                 print('错误')
17         if user_state == True:
18             func()
19     return inner
20 
21 
22 @login  #home = login(home)
23 def home():
24     print('首页')
25 
26 home()
27 def zy():
28     print('综艺')
29 def dsj():
30     print('电视剧')'''

其中22行 @login  等价于 home = login(home) 
login()函数返回一个函数对象,将函数对象赋值给home ,再调用home() ,这样就不改变调用方式。

这时我们又要增强功能,比如综艺节目有很多,大家都喜欢看一些芒果台的综艺节目,在调用zy()时传入参数,选择自己想看的综艺节目。

 1 login_status = False
 2 
 3 def login(func):
 4     def inner(*args):
 5         _username = 'abc'
 6         _password = '123'
 7         global login_status
 8 
 9         if login_status == False:
10             username = input('用户名')
11             password = input('密码')
12 
13             if username == _username and password == _password:
14                 print('登录成功1')
15                 login_status = True
16             else:
17                 print('错误')
18         if login_status == True:
19             func(*args)
20     return inner
21 
22 @login       # login(dsj)  login(qq)(dsj)(aq)
23 def dsj(style):
24     print('%s电视剧' %style)
25 dsj('aq')
26 @login
27 def zy(style):
28     print('%s综艺' %style)
29 zy('芒果')

突然有一天,这个视频网站被腾讯收购了,只能用qq登录

 1 login_status = False
 2 
 3 def login(login_type):
 4     def auth(func):
 5         def inner(*args):
 6             if login_type == 'qq':
 7                 _username = 'abc'
 8                 _password = '123'
 9                 global login_status
10 
11                 if login_status == False:
12                     username = input('用户名')
13                     password = input('密码')
14 
15                     if username == _username and password == _password:
16                         print('登录成功1')
17                         login_status = True
18                     else:
19                         print('错误')
20                 if login_status == True:
21                     func(*args)
22             else:
23                 print('only qq login')
24         return inner
25     return auth
26 
27 @login('qq')       # login(dsj)  login(qq)(dsj)(aq)
28 def dsj(style):
29     print('%s电视剧' %style)
30 #dsj('爱情')
31 
32 @login('qq')
33 def zy(style):
34     print('%s综艺' %style)
35 zy('芒果')

 

posted on 2018-01-24 10:25  elif_syh  阅读(137)  评论(0)    收藏  举报

导航