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的结果
不用计时

  

 

posted @ 2017-04-10 15:43  Michael--chen  阅读(215)  评论(0编辑  收藏  举报