python从零开始--21 装饰器

装饰器:本质是一个Python函数,它的功能是让其它函数在不需要做任何代码变动的情况下,额外增加功能。

这篇文章写的很好,我将链接地址放这里:https://blog.csdn.net/xiangxianghehe/article/details/77170585


小白如何一步步写一个简单的装饰器: 

step1. 装饰器需要将需要装饰的函数作为入参,下面例子中的func就代表被装饰的函数。所以第一步就是定义一个装饰器函数,其参数为func。

 def  deco(func):


step2:第二步是定一个返回函数,该函数用来包装func,即一个包括了func功能,然后同时加入了扩展代码的返回函数。

 def deco(func):

         def wrapper():

         return wrapper


step3: 第三步,在wrapper()函数中将func()包括进来,鉴于func()可能有各种参数,为了能匹配各种参数,用(*args, **kwargs)作为其参数。

 def deco(func):

         def wrapper(*args, **kwargs):

                     func(*args, **kwargs)

         return wrapper


step4: 在wrapper中加入扩展的代码

 def deco(func):

         def wrapper(*args, **kwargs):

      xxxxxx #func运行前执行的代码

                     func(*args, **kwargs)

      xxxxxx #func运行后执行的代码

         return wrapper


step 5: 使用

@ deco

funcaaa()


@deco

funcbbb(ss, dd, *tuple1, **key1)


import time

def deco_time(func):

    def wrapper(*args, **kwargs):
        begin_time = time.time()
        func(*args, **kwargs)
        end_time = time.time()
        process_time = (end_time - begin_time) * 1000
        print("{}执行时间为{}毫秒。".format(func.__name__, process_time))

    return wrapper

@deco_time
def sleep_1sec_func(str_for_print):
    print(str_for_print)
    time.sleep(1)

@deco_time
def sleep_2sec_func():
    time.sleep(2)

s1 = "使用等待1秒"
sleep_1sec_func(s1)

sleep_2sec_func()
使用等待1秒
sleep_1sec_func执行时间为1000.0572204589844毫秒。
sleep_2sec_func执行时间为2000.1144409179688毫秒。

写一个带参数的装饰器:

有些情况装饰器需要带参数,以获取更高的灵活度,具体的写法步骤如下:

step1. 装饰器需要将需要装饰的函数作为入参,下面例子中的func就代表被装饰的函数。所以第一步就是定义一个装饰器函数,其参数为func。

 def  deco(func):


step2:第二步是定一个返回函数,该函数用来包装func,即一个包括了func功能,然后同时加入了扩展代码的返回函数。

 def deco(func):

         def wrapper():

         return wrapper


step3: 第三步,在wrapper()函数中将func()包括进来,鉴于func()可能有各种参数,为了能匹配各种参数,用(*args, **kwargs)作为其参数。

 def deco(func):

         def wrapper(*args, **kwargs):

                     func(*args, **kwargs)

         return wrapper

step4: 加上带参数的函数

def add_para_deco(para):        # para为参数

 def deco(func):

         def wrapper(*args, **kwargs):

                     func(*args, **kwargs)

         return wrapper

 return deco   #注意要加返回函数deco


step5 在wrapper中加入基于参数的扩展的代码,例如

def add_para_deco(para):        # para为参数

 def deco(func):

         def wrapper(*args, **kwargs):

      if para = "xxx": 

                                yyyyyyyy

                      else: 

                                 kkkkkkk

                     func(*args, **kwargs)

         return wrapper

 return deco   #注意要加返回函数deco


step 6: 使用

@add_para_deco("xxx")

 def sleep_1sec_func(xxxx):

           xxxxxx


import time


def log_time(timing):
    def deco_time(func):
        def wrapper(*args, **kwargs):
            begin_time = time.asctime(time.localtime(time.time()))
            func(*args, **kwargs)
            end_time = time.asctime(time.localtime(time.time()))
            if timing == "begin":
                print("{}开始执行的时间为{}".format(func.__name__,begin_time))
            elif timing == "end":
                print("{}结束执行的时间为{}".format(func.__name__,end_time))
            else:
                print("对{}装饰logtime时输入的参数错误".format(func.__name__))
        return wrapper
    return deco_time


@log_time("end")
def sleep_1sec_func(str_for_print):
    print(str_for_print)
    time.sleep(1)


@log_time("begin")
def sleep_2sec_func():
    time.sleep(2)


if __name__ == "__main__":
    s1 = "使用等待1秒"
    sleep_1sec_func(s1)
    sleep_2sec_func()


阅读更多
个人分类: python从零开始
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

不良信息举报

python从零开始--21 装饰器

最多只允许输入30个字

加入CSDN,享受更精准的内容推荐,与500万程序员共同成长!
关闭
关闭