zoukankan      html  css  js  c++  java
  • 装饰器原理

    原理:
    原有函数:
        def fun_1()

    正常调用原有函数:
        fun_1()

    现有需要需要在原有函数基础上添加新功能,但是不改变原有函数

    法一:

        1、添加新函数(装饰一波)
        def fun_2(fun_1):
            # 嵌套函数。返回函数地址(fun_3 ),调用时才执行
            def fun_3():
            return fun_3                

        2、现在调用方式
            # 装饰
            fun_1 = fun_2(fun_1) # 先执行右边(外函数执行,返回一个内函数地址),再复制给左边(内函数地址)
            # 调用
            fun_1()

    法二:
        注解方式
        @fun_2

    示例(带参数):
    user_status = False # 用户登录了就把这个改成True
    def login(func):  # henan
        def inner(*arg, **kwargs):
            _username = 'alex'  # 假装这是DB里存的用户信息
            _password = 'abc!123'  # 假装这是DB里存的用户信息
            global user_status
            if user_status == False:
                pass
            else:
                print("用户已经登录,验证通过")
            if user_status:
                func(*arg, **kwargs)
        return inner
            

    def home():
        print('---------首页-----------')        
        
    def america():
        print('---------欧美专区-----------')        
        
    def japan():
        print('---------日韩专区-----------')        
        
        
    #@login  # henan = login(henan)  #inner
    def henan(style):    
        print('---------河南专区-----------', style)
       
    henan = login(henan)    # inner
    print(henan)    

    #  调用
    henan('3p')  # inner()

    示例2

    user_status = False # 用户登录了就把这个改成True
    def login(auth_type):  # qq
        def outer(func):  # henan
            def inner(*arg, **kwargs):  # 3p
                _username = 'alex'  # 假装这是DB里存的用户信息
                _password = 'abc!123'  # 假装这是DB里存的用户信息
                global user_status
                if user_status == False:
                    username = input('user:')
                    password = input('password:')
                    if username == _username and password == _password:
                        print('welcome login....')
                        user_status = True
                    else:
                        print('wrong username or password')
                else:
                    print("用户已经登录,验证通过")
                if user_status:
                    func(*arg, **kwargs)
            return inner
        return outer
        
        
    #henan = login('qq')  # outer
    #print(henan)    
    #r = henan('3p')  # inner
    #print(r())

    xx = login('qq')
    print(xx)
    henan = xx(henan)
    print(henan)
    henan('3p')

    '''
    xx = login('qq')
    print(xx)
    henan = xx(henan)
    print(henan)

    <==> @login('qq')
    '''

  • 相关阅读:
    使用hugo在gitee上写blog
    golang初识2
    golang初识1
    install go on ubuntu
    sql优化的几种方式
    UpdatePanel 无刷新弹出窗口
    .net web 点击链接在页面指定位置显示DIV的问题
    重建主键
    sql 日期时间格式转换
    UpdatePanel无法直接弹出窗口的解决
  • 原文地址:https://www.cnblogs.com/fmgao-technology/p/9062639.html
Copyright © 2011-2022 走看看