• 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')
  • 相关阅读:
    zz[读书笔记]《Interpretable Machine Learning》
    Xgboost,LightGBM 和 CatBoost
    zz:Xgboost 导读和实战
    bzoj3252: 攻略 优先队列 并查集 贪心
    [BeiJing2009 WinterCamp]取石子游戏 Nim SG 函数
    Playing With Stones UVALive
    Division Game UVA
    [BJWC2011]禁忌 AC 自动机 概率与期望
    [Jsoi2010]连通数 bitset + Floyd
    洛谷P2197 nim游戏模板
  • 原文地址:https://www.cnblogs.com/lovepy3/p/8687493.html
Copyright © 2020-2023  润新知