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

    定义:本质是函数,装饰其他函数

    原则:

    • 不能修改被装饰的函数源代码
    • 不能修改被修饰的函数调用方式

    实现:

    1. 函数即变量
    2. 高阶函数(把一个函数名当做实参传给另一个,从而实现不修改源代码来添加功能;返回值包含函数名,从而不修改函数的调用方式)
    3. 嵌套函数
    import time
    def timer(fun):
        def deco(*args,**kwargs):
            start=time.time()
            fun(*args,**kwargs)
            stop=time.time()
            print("time =%s"%(stop-start))#记录运行时间功能
        return deco#返回的是内存地址
    @timer#t=timer(test2)()
    def test2(name):
        time.sleep(2)
        print("in the test2:",name)
    test2("hello")
    decorator

    装饰器就是给源代码添加功能,同时有不修改源代码和调用方式。

    功能也可以添加多种,在函数上存在嵌套,如下图:

    #_*_coding:utf-8_*_
    
    
    user_status = False #用户登录了就把这个改成True
    
    def login(auth_type): #把要执行的模块从这里传进来
        def auth(func):
            def inner(*args,**kwargs):#再定义一层函数
                if auth_type == "qq":
                    _username = "alex" #假装这是DB里存的用户信息
                    _password = "abc!23" #假装这是DB里存的用户信息
                    global user_status
    
                    if user_status == False:
                        username = input("user:")
                        password = input("pasword:")
    
                        if username == _username and password == _password:
                            print("welcome login....")
                            user_status = True
                        else:
                            print("wrong username or password!")
    
                    if user_status == True:
                        return func(*args,**kwargs) # 看这里看这里,只要验证通过了,就调用相应功能
                else:
                    print("only support qq ")
            return inner #用户调用login时,只会返回inner的内存地址,下次再调用时加上()才会执行inner函数
    
        return auth
    
    def home():
        print("---首页----")
    
    @login('qq')
    def america():
        #login() #执行前加上验证
        print("----欧美专区----")
    
    def japan():
        print("----日韩专区----")
    
    @login('weibo')
    def henan(style):
        '''
        :param style: 喜欢看什么类型的,就传进来
        :return:
        '''
        #login() #执行前加上验证
        print("----河南专区----")
    
    # home()
    # america = login(america) #你在这里相当于把america这个函数替换了
    #henan = login(henan)
    
    # #那用户调用时依然写
    # america()
    # japan()
    henan("3p")
    高级一点的装饰器
    是什么让你疯狂?
  • 相关阅读:
    FC网络学习笔记02 -网络配置方法 分类: 网络基础 2013-10-10 09:43 765人阅读 评论(0) 收藏
    FC网络学习笔记01 分类: 网络基础 2013-10-10 09:42 865人阅读 评论(0) 收藏
    CPLD/FPGA厂商概述 . 分类: 硬件开发_FPGA 2013-10-09 16:54 539人阅读 评论(0) 收藏
    @property用法总结
    python的目录
    su
    os.path.join路径拼接
    python的类变量和对象变量[转]
    python的mutable变量与immutable变量
    dataframe操作
  • 原文地址:https://www.cnblogs.com/iforelse/p/6781932.html
Copyright © 2011-2022 走看看