首页 > 编程语言 > 详细

python装饰器

时间:2020-04-30 17:25:49      阅读:53      评论:0      收藏:0      [点我收藏+]

文章内容转载自上海-悠悠:https://www.cnblogs.com/yoyoketang/p/10801242.html

python装饰器本质上就是一个函数,它可以让其他函数在不需要做任何代码变动的前提下增加额外的功能,装饰器的返回值也是一个函数对象。

1、装饰器结构

def w1(func):
    def inner():
        # 验证1
        # 验证2
        # 验证3
        return func()
    return inner
 
@w1
def f1():
    print ‘f1‘

2、函数装饰器

1)函数不带参数

#函数装饰器-函数不带参数
import time
def runtime(func):
    def wrapper():
        start = time.time()
        f = func()     # 原函数
        end = time.time()
        print("运行时长:%.4f 秒" % (end-start))
        return f
    return wrapper

@runtime
def func_a():
    print("func_a")
    time.sleep(0.5)

@runtime
def func_b():
    print("func_b")
    time.sleep(0.8)

if __name__ == ‘__main__‘:
    func_a()
    func_b()

技术分享图片 

2)函数带参数

#函数装饰器-函数带参数
import time
def runtime(func):
    def wrapper(*args,**kwargs):
        start = time.time()
        f = func(*args,**kwargs)     # 原函数
        end = time.time()
        print("运行时长:%.4f 秒" % (end-start))
        return f
    return wrapper

@runtime
def func_a(a):
    print("func_a")
    print("a="+a)
    time.sleep(0.5)

@runtime
def func_b(b,c="3"):
    print("func_b")
    print("b="+b)
    print("c="+c)
    time.sleep(0.8)

if __name__ == ‘__main__‘:
    func_a("1")
    func_b("2")

技术分享图片

3)装饰器带参数

#函数装饰器-装饰器带参数
import time
def runtime(slowly=1):
    def wrapper(func):
        def inner_wrapper(*args, **kwargs):
            start = time.time()
            f = func(*args, **kwargs)     # 原函数
            end = time.time()
            t = end-start
            print("运行时长:%.4f秒"%t)
            time.sleep(slowly)  # 延迟效果
            new_end = time.time()
            print("延时时长:%.4f 秒" % (new_end-start))
            return f
        return inner_wrapper
    return wrapper

@runtime(1.5)
def func_a(a):
    print("a="+a)
    time.sleep(0.5)

@runtime(0.5)
def func_b(b, c="c"):
    print("b="+b)
    print("c="+c)
    time.sleep(0.8)

if __name__ == ‘__main__‘:
    func_a("a")
    func_b("b", c="c")

技术分享图片

 3、类装饰器

1)装饰器不带参数

#类装饰器-装饰器带参数
import time
class runtime:
    def __call__(self, func):
        def inner_wrapper(*args, **kwargs):
            start = time.time()
            f = func(*args, **kwargs)     # 原函数
            end = time.time()
            t = end-start
            print("运行时长:%.4f秒"%t)
            return f
        return inner_wrapper

@runtime()
def func_a(a):
    print("a="+a)
    time.sleep(0.5)

@runtime()
def func_b(b, c="c"):
    print("b="+b)
    print("c="+c)
    time.sleep(0.8)

if __name__ == ‘__main__‘:
    func_a("a")
    func_b("b", c="c")

技术分享图片

2)装饰器带参数

#类装饰器-装饰器带参数
import time
class runtime:
    def  __init__(self,slowly=1):
        self.slowly=slowly
    def __call__(self, func):
        def inner_wrapper(*args, **kwargs):
            start = time.time()
            f = func(*args, **kwargs)     # 原函数
            end = time.time()
            t = end-start
            print("运行时长:%.4f秒"%t)
            time.sleep(self.slowly)  # 延迟效果
            new_end = time.time()
            print("延时时长:%.4f 秒" % (new_end-start))
            return f
        return inner_wrapper
    
@runtime(1.5)
def func_a(a):
    print("a="+a)
    time.sleep(0.5)

@runtime(0.5)
def func_b(b, c="c"):
    print("b="+b)
    print("c="+c)
    time.sleep(0.8)

if __name__ == ‘__main__‘:
    func_a("a")
    func_b("b", c="c")

技术分享图片

python装饰器

原文:https://www.cnblogs.com/crystal1126/p/12809587.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!