Python-21_装饰器-02_装饰器实现

Posted newmet

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Python-21_装饰器-02_装饰器实现相关的知识,希望对你有一定的参考价值。

-------------------------------------------------- 一、基本:--------------------------------------------------

import time
"""
# 1、装饰器框架:
def timer(func):
    def wrapper():
        print(func)
        func()
    return wrapper    
"""
# 2、装饰器实现例子:
# 1)、装饰器:
def timer(func):
    def wrapper():
        start_time = time.time()
        func()  # 运行的是foo()
        stop_time = time.time()
        print("被装饰函数test运行时间 %s" % (stop_time - start_time))
    return wrapper
# 2)、被装饰函数:
@timer              # @timer   就相当于 foo=timer(foo)  需要放在被装饰函数的上面!!!!
def foo():
    time.sleep(2)
    print("需要增加功能的原程序")
    return "原程序返回值"
# 3)、调用装饰器:
# foo=timer(foo)          # timer(foo) 返回的是wrapper内存地址
foo()  # 执行的是wrapper

--------------------------------------------------二、加上返回值:--------------------------------------------------

import time
# 1)、装饰器:
def timer(func):
    def wrapper():
        start_time=time.time()
        res=func()              # 运行的是foo()  如果原程序有return返回值,这里将func()运行结果赋值给res,然后return res
        stop_time=time.time()
        print("被装饰函数foo运行时间 %s" %(stop_time-start_time))
        return res
    return wrapper

# 2)、被装饰函数:
@timer              # @timer   就相当于 foo=timer(foo)  需要放在被装饰函数的上面!!!!
def foo():
    time.sleep(2)
    print("需要增加功能的原程序")
    return "原程序返回值"
# 3)、调用装饰器:
# foo=timer(foo)          # timer(foo) 返回的是wrapper内存地址
a=foo()                    # 执行的是wrapper
print(a)

-------------------------------------------------- 三、加上参数:--------------------------------------------------

import time
# 1)、装饰器:
def timer(func):
    def wrapper(*args,**kwargs):               # *args,**kwargs  可以接收任何个数(多个)的参数
        start_time=time.time()
        res=func(*args,**kwargs)              # 运行的是foo()  如果原程序有return返回值,这里将func()运行结果赋值给res,然后return res
        stop_time=time.time()
        print("被装饰函数foo运行时间 %s" %(stop_time-start_time))
        return res
    return wrapper

# 2)、被装饰函数:
@timer              # @timer   就相当于 foo=timer(foo)  需要放在被装饰函数的上面!!!!
def foo(name,age):
    time.sleep(2)
    print("需要增加功能的原程序 名字 %s 年龄 %s" %(name,age))
    return "原程序返回值"
# foo=timer(foo)
a=foo("newmet",18)
print(a)

-------------------------------------------------- 四、装饰器实现汇总:--------------------------------------------------

import time
# 定义一个求取函数运行时间的、装饰器框架
def timer(func):
    def wrapper(*args,**kwargs):
        start_time=time.time()
        res=func(*args,**kwargs)
        stop_time=time.time()
        print("函数运行时间:%s" %(start_time-stop_time))
        return res
    return wrapper
# 原始函数--需要被装饰的函数
@timer
def foo(name,age):
    time.sleep(3)
    print("from the test 名字 %s 年龄 %s" %(name,age))
    return "这是test的返回值"
res=foo("newmet",16)
print(res)

 

以上是关于Python-21_装饰器-02_装饰器实现的主要内容,如果未能解决你的问题,请参考以下文章

类装饰器

装饰器初析

python学习5_装饰器

python装饰器参数[重复]

装饰器的完整实现及原理

装饰器、装饰器类与类装饰器(三)