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

    #装饰器:本质是函数,装饰其他函数。就是为其它函数添加附加功能。

    #timer(): #装饰器函数
    # 嵌套子函数(*args,**kwargs):
    # test1()
    # return 嵌套子函数名
    #test1() #被装饰的函数


    #原则:
    #1.不能修改被装饰的函数的源代码
    #2.不能修改被装饰的函数的调用方式
    #实现装饰器的知识储备:
    #1.函数即“变量”
    #2.高阶函数
    #3.嵌套函数
    #高阶函数+嵌套函数=装饰器

    # @ 符号就是装饰器的语法糖,把它放在被装饰的函数前面,这样就可以省略最后一步再次赋值的操作。
    # 装饰器的用法: 直接: @装饰器函数名 相当于:被装饰的函数名 = 装饰器(被装饰的函数名)

    import time

    def timer(func): #定义一个装饰器,func名称任意,用于代表被装饰的函数
    def deco(*args,**kwargs): #嵌套函数,符合装饰器特征。在这里添加各种装饰命令。括号里面的形参可以接收各种参数,具有扩展性
    start_time = time.time()
    func(*args,**kwargs) #相当于调用了被装饰的函数
    stop_time = time.time()
    print("the func run time is %s" %(stop_time-start_time)) #给test1添加的额外命令
    return deco #返回函数内存地址,不能少。否则出现:object is not callable不可调用错误

    @timer # 语法糖,@timer是一个装饰器,在被装饰的函数前面添加。相当于执行了:test1 = timer(test1)
    def test1(): #被装饰的函数
    time.sleep(1)
    print("in the test1")

    @timer # 语法糖,@timer是一个装饰器,在被装饰的函数前面添加。相当于执行了:test2 = timer(test2)
    def test2(name,age): #被装饰的函数
    print("test2:",name,age)

    test1() #关键部分:调用被装饰的函数,之后装饰器会自动执行。装饰器执行过程中,除test1正常执行外,还将执行装饰器中的其它命令
    test2("alex",22) #关键部分:调用被装饰的函数,之后装饰器会自动执行。
    #########################################################
    #如果不用语法糖,也可以这样写:
    import time

    def timer(func):
    def wrapper(*args,**kwargs):
    start_time = time.time()
    func()
    stop_time = time.time()
    print("%s run time is: %s " %(func.__name__,stop_time-start_time))
    return wrapper

    def test1():
    time.sleep(1)
    print("In the test1")

    def test2():
    time.sleep(1)
    print("In the test2")

    test1 = timer(test1) #相当于@语法糖
    test2 = timer(test2) #相当于@语法糖

    test1() #关键部分,调用被装饰的test1函数
    test2()

  • 相关阅读:
    40 修改了机器名,portal重装后,还需要做什么?
    39 路径分析小练习
    38 空间查询小练习
    面向对象一些概念简述
    Js函数基本介绍
    JS中的变量和数据类型
    js基础语法
    Css样式优先级
    对响应式布局的理解和认知
    关于Flex布局
  • 原文地址:https://www.cnblogs.com/hy007x/p/7727601.html
Copyright © 2011-2022 走看看