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")
    高级一点的装饰器
    是什么让你疯狂?
  • 相关阅读:
    AJ学IOS 之ipad开发qq空间项目横竖屏幕适配
    C语言小练习之学生信息管理系统
    014-预处理指令-C语言笔记
    013-结构体-C语言笔记
    012-C语言小游戏之推箱子
    011-指针(上)-C语言笔记
    010-字符串-C语言笔记
    009-数组-C语言笔记
    008-进制-C语言笔记
    007-函数-C语言笔记
  • 原文地址:https://www.cnblogs.com/iforelse/p/6781932.html
Copyright © 2011-2022 走看看