zoukankan      html  css  js  c++  java
  • 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')
  • 相关阅读:
    常用词汇短语
    Java中的数据结构
    Java中的设计模式
    .NET中的编译、程序调用
    常用口语
    0. Angular框架原理
    茶叶
    NPOI自定义单元格背景颜色
    ASP.NET MVC添加Action就找不到
    navicat for mysql 导入SQL Server显示中文乱码解决办法
  • 原文地址:https://www.cnblogs.com/lovepy3/p/8687493.html
Copyright © 2011-2022 走看看