Day 3-5 装饰器
开放-封闭原则:
- 封闭:已实现的功能代码块不应该被修改.
- 开放:对现有功能的扩展开放.
装饰器:
定义:在符合'开放-封闭'的原则下,给程序扩展其他的功能!
例:在不更改tokyo函数的情况下。给tokyo函数加上一个验证模块。
1 def tokyo(): 2 print('日本专区'.center(30, '-')) 3 4 5 def america(): 6 print('美洲专区'.center(30, '-')) 7 8 9 def euro(): 10 print('欧洲专区'.center(30, '-')) 11 12 user_status = False 13 14 15 def login(func): 16 def inner(): 17 global user_status 18 if user_status == False: 19 user = input('user:').strip() 20 password = input('password:') 21 if user == 'alex' and password == '123': 22 print('welcome....') 23 user_status = True 24 if user_status: 25 func() # 用户通过验证后,执行login传进来的函数. 26 return inner # 把inner的内存地址返回给login(func),所以下面tokyo = login(tokyo)的时候,其实等于tokyo = login(tokyo) = inner 27 # 相当于用闭包和函数的重新赋值,完成了装饰器. 28 29 tokyo = login(tokyo) 30 tokyo()
上面的代码也可以简写成下面的形式:
1 user_status =False 2 def login(func): 3 4 def inner(*args): # *args 非固定参数,可以多传或者不传 5 acc_user = 'alex' 6 acc_pwd = '1234' 7 global user_status 8 if user_status == False: 9 username = input('username>>>') 10 password = input('password>>>') 11 if username == acc_user and password == '1234': 12 print('welcome,%s' % username) 13 user_status = True 14 else: 15 print('username or password Error.') 16 else: 17 print('已通过验证,欢迎您!') 18 if user_status == True: 19 func(*args) 20 return inner # 把inner的内存地址返回给login(). 21 22 def home(): 23 print('首页'.center(34, '*')) 24 25 26 27 28 def euro(): 29 print('欧洲专区'.center(30, '*')) 30 31 @login 32 def japan(stlye): 33 print('日本专区'.center(30, '*'),stlye) 34 35 @login # 在要加验证的函数前加上@+验证函数.相当于,@login(america).在程序运行时,会默认先运行一次.@login(america)返回的是inner的内存地址,当调用america()时,等价于america()=inner() 36 def america(): 37 print('美洲专区'.center(30, '*')) 38 39 40 japan('6666') # 如果在这里传参,相当于把这个参数传给inner('666')