zoukankan      html  css  js  c++  java
  • Python基础之装饰器

      一、 什么是装饰器:

      器即函数;

      装饰即修饰,意指为其他函数添加新功能。

      装饰器定义:本质就是函数,功能是为其他函数添加新功能。

      二、装饰器需要遵循的原则:

      1.不修改被装饰函数的源代码(开放封闭原则);

      2.为被装饰函数添加新功能后,不修改被修饰函数的调用方式。

      三、无参装饰器:

      不用传参数来使用装饰器。

      以下的操作是为函数foo来增加新的计时功能:不改变原函数的代码和调用方式

    import time #调用time模块
    
    def timmer(func): #装饰器timmer,将函数foo的函数名为参数传给timmer
        def wrapper():#嵌套函数
            start_time = time.time()#开始时间
            func() #func=函数foo 加括号函数直接被调用
            stop_time = time.time() #结束时间
            print("函数运行的时间是%s"%(stop_time-start_time))
        return wrapper #返回wrapperde
    
    @timmer #装饰器的语法@+装饰器名,foo = timmer(foo)
    def foo(): #定义的一个无参函数
        time.sleep(2) #使程序睡眠2s
        print("welcome to beijing")
    
    foo() #调用foo函数
    ---------------------以下是输出结果----------------------
        welcome to beijing
        函数运行的时间是2.0
    

      四、有参装饰器:

      要传参数来使用装饰器。

      以下的操作是为函数my_max来增加新的计时功能,通过装饰器传的参数判断,执行对应的代码,实现相应的功能:

    不改变原函数的代码和调用方式。

    import time  # 调用time模块
    #定义装饰器阶段
    def choice(x=1): #通过装饰器传的参数(默认为1),完成下面的判断,达到自己想要的状态
        def timmer(func):  # 嵌套函数
            def wrapper(*args, **kwargs):  # 接收参数
                if x == 1: #当装饰器传的参数是1时,就启用计时功能
                    start_time = time.time()  # 开始计时
                    func(*args, **kwargs)  # func=函数my_max 加括号来调用函数
                    stop_time = time.time()  # 结束计时
                    print("函数的运行时间是%s" % (stop_time - start_time))
                elif x == 0: #当装饰器传的参数是0时,就不启用计时功能
                    func(*args, **kwargs)  # func=函数my_max 加括号来调用函数
                    print("不用计时")
            return wrapper  # 返回wrapper
        return timmer #返回timmer
    #调用装饰器
    @choice()#要加括号传参数运行函数的  #@timmer  my_max=timmer(my_max)#为my_max这个函数增加计时功能
    def my_max(x, y):  # 比较两个数的大小
        time.sleep(2)  # 睡眠2s,方便实验效果
        res = x if x > y else y  # 判断x与y的大小
        print("from the my_max,the max is %s" % res)
    #调用函数阶段
    my_max(1, 2)  # 调用函数并按位置传参
    -----------------------输出结果----------------------
    from the my_max,the max is 2  #这是使用的默认参数的结果
    函数的运行时间是2.0
    #当@choice(0) 时
    -----------------------输出结果----------------------
    from the my_max,the max is 2 #choice传的参数是0的结果
    不用计时
    

      

  • 相关阅读:
    python中的编码问题
    CVPR2018 Tutorial 之 Visual Recognition and Beyond
    hdu 1376 Octal Fractions
    hdu 1329 Hanoi Tower Troubles Again!
    hdu 1309 Loansome Car Buyer
    hdu 1333 Smith Numbers
    hdu 1288 Hat's Tea
    hdu 1284 钱币兑换问题
    hdu 1275 两车追及或相遇问题
    hdu 1270 小希的数表
  • 原文地址:https://www.cnblogs.com/Michael--chen/p/6689351.html
Copyright © 2011-2022 走看看