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')
原文地址:https://www.cnblogs.com/lovepy3/p/8687493.html