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('芒果')
浙公网安备 33010602011771号