码迷,mamicode.com
首页 > 编程语言 > 详细

浅谈对python装饰器的理解

时间:2020-06-22 14:52:59      阅读:68      评论:0      收藏:0      [点我收藏+]

标签:改变   wrap   接收   color   span   turn   pre   闭包   结构   

1.概念:在不改变原函数结构的情况下,给函数体本身增加部分功能(常见如接口函数被调用时,自动打印接口被调用日志)

2.本质:装饰器的本质是一个闭包函数,而闭包函数的本质是变量作用域的外溢(外层函数中包裹的内部函数可使用外层函数的参数,以及接受其值)

3.分类:

  a.函数装饰器

def deco(func):                   #func即是要接收的被砖石的函数名
    def wrapper(*args,**kwargs):  #可以根据被装饰的函数需不需要传参,给被装饰的对象传入参数
        res=func(*args,**kwargs)  #本质就是调用被装饰的函数, 接收传进来的参数
        print("xyz")
        return res                #接收被装饰函数的返回值,没有则返回None
    return wrapper 

@deco
def sun(a):
    print(str(a))
    print("abc")
if __name__ == "__main__":
    sun(123)


输出结果:
123
abc
xyz

  b.装饰器类(实现了__init__和__call__方法的类)

import time
class Foo():
    def __init__(self,func):
        self.func = func
    
    def __call__(self):
        print("装饰函数开始运行...")
        start_time = time.time()
        print(start_time)
        self.func()
        end_time = time.time()
        print("装饰完成...")
        print(end_time)
@Foo
def sun():
    print("执行sun函数...")

if __name__ == "__main__":
    sun()
输出:
装饰函数开始运行...
1592806290.9291573
执行sun函数...
装饰完成...
1592806290.9291573

  c.装饰器类接受被装饰函数的多个参数

class Cho:
    def __init__(self,name):
        self.name = name

    def __call__(self,func):
        def wrapper(*args,**kwargs):
            print(----,self.name)
            return func(*args,**kwargs)
        return wrapper

 

浅谈对python装饰器的理解

标签:改变   wrap   接收   color   span   turn   pre   闭包   结构   

原文地址:https://www.cnblogs.com/suntao-jupyter/p/13176594.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!