• python-装饰器


    python—装饰器

    在符合开放-封闭的前提下,增加新功能

    • 封闭:已实现的功能代码块不应该被修改
    • 开放:对现有功能的扩展开放

    要求:在不改变原来代码的前提下,增加登录功能

    # *_*coding:utf-8 *_*
    
    user_status = False #用户登录了就把这个改成True
    
    def login(func):
        _username = "alex" #假装这是DB里存的用户信息
        _password = "123" #假装这是DB里存的用户信息
        global user_status
        while not user_status:
            username = input("user:")
            password = input("pasword:")
            if username == _username and password == _password:
                user_status = True
                print('登录成功!')
            else:
                print('登录失败!')
        if user_status == True:
            func()
    
    def home():
        print("---首页----")
    
    def movie():
        # login() #执行前加上验证
        print("----电影----")
    
    def cartoon():
        print("----动漫----")
    
    def game():
        # login() #执行前加上验证
        print("----游戏----")
    
    
    game = login(game)
    # 这个时候发现,还没有 调用 home() 的时候程序就已经执行了,因为= 右边 login(home) 的时候,会让函数执行,怎么办?
    

    为了不改变原来的调用方式: game()

    我们使用 game = login(game)的方式重新赋值,但是发现这个时候程序已经执行了,所以,再内嵌一个函数

    # *_*coding:utf-8 *_*
    
    user_status = False #用户登录了就把这个改成True
    
    def login(func):
       def inner():
           _username = "tt"  # 假装这是DB里存的用户信息
           _password = "123"  # 假装这是DB里存的用户信息
           global user_status
           while not user_status:
               username = input("user:")
               password = input("pasword:")
               if username == _username and password == _password:
                   user_status = True
                   print('登录成功!')
               else:
                   print('登录失败!')
           if user_status == True:
               func()
       return inner
    
    def home():
        print("---首页----")
    
    def movie():
        # login() #执行前加上验证
        print("----电影----")
    
     
    def cartoon():
        print("----动漫----")
    
    # @login  #等价于 henan = login(game)   相当于,把 game 当做参数传入 login()
    def game():
        print("----游戏----")
        
    #game = login(game)
    
    game()
    

    装饰器

    ........
    # @login  #等价于 henan = login(game)   相当于,把 game 当做参数传入 login()
    def game():
        print("----游戏----")
    ............
    

    等价于

    ...........
    def game():
        print("----游戏----")
        
    game = login(game)
    ...........
    

    接下来,我们要给装饰器加参数:

    user_status = False #用户登录了就把这个改成True
    
    def login(func):
       def inner(*args, **kwargs):
           _username = "tt"  # 假装这是DB里存的用户信息
           _password = "123"  # 假装这是DB里存的用户信息
           global user_status
           while not user_status:
               username = input("user:")
               password = input("pasword:")
               if username == _username and password == _password:
                   user_status = True
                   print('登录成功!')
               else:
                   print('登录失败!')
           if user_status == True:
               func(*args, **kwargs)
       return inner
    
    def home():
        print("---首页----")
    
    def movie():
        # login() #执行前加上验证
        print("----电影----")
    
    def cartoon():
        print("----动漫----")
    
    @login  #等价于 henan = login(game)   相当于,把 game 当做参数传入 login()
    def game(*args, **kwargs):
        print("----游戏----",args)
    
    
    # game = login(game)
    
    game('合金弹头','火影OL')
    

    打印结果:

    user:tt
    pasword:123
    登录成功!
    ----游戏---- ('合金弹头', '火影OL')
    

    再加一层:

    # *_*coding:utf-8 *_*
    # 登录时候要加认证
    user_status = False #用户登录了就把这个改成True
    
    def login(auth_type):
        def auth(func):
           def inner(*args, **kwargs):
               _username = "tt"  # 假装这是DB里存的用户信息
               _password = "123"  # 假装这是DB里存的用户信息
               global user_status
               while not user_status:
                   username = input("user:")
                   password = input("pasword:")
                   if username == _username and password == _password:
                       user_status = True
                       print('登录成功!')
                   else:
                       print('登录失败!')
               if user_status == True:
                   func(*args, **kwargs)
           return inner
        return auth
    def home():
        print("---首页----")
    
    def movie():
        # login() #执行前加上验证
        print("----电影----")
    
    def cartoon():
        print("----动漫----")
    
    @login('wechat')  #等价于 xx = login('wechat')  game = xx(game)
    def game(*args, **kwargs):
        print("----游戏----",args)
    
    
    # xx = login('wechat')
    # game = xx(game)
    
    game('王者荣耀')	
    
    #打印结果:
    user:tt
    pasword:123
    登录成功!
    ----游戏---- ('王者荣耀',)
    
    @login('wechat')  #等价于 xx = login('wechat')  game = xx(game)
    def game(*args, **kwargs):
        print("----游戏----",args)
    

    @login,表示先调用 login() ,调用之后返回了一个 函数auth ,然后就相当于这个时候变成了

    @auth #@auth 会调用 auth函数,把game作为参数传进去 — auth(game)
    def game(*args, **kwargs):
        print("----游戏----",args)
    
  • 相关阅读:
    对WM_NCHITTEST消息的了解+代码实例进行演示(消息产生消息,共24个枚举值)
    windows 下,用CreateWaitableTimer SetWaitableTimer 创建定时器(用轮询的办法保持高精度)
    YUI的模块化开发
    内存管理
    WCF从零学习之WCF概述(一)
    MVC编辑状态两个DropDownList联动
    HashMap的工作原理
    初探performance.timing API
    异步编程
    Nikola的5项依赖注入法则
  • 原文地址:https://www.cnblogs.com/friday69/p/9293915.html
Copyright © 2020-2023  润新知