python装饰器的一些理解

装饰器其实就是将函数作为一个参数传入另一个函数中,返回可以是函数也可以不是函数。
类似如下:

def add(x, y):
    return x + y

def add_num(func, x, y):
    print(func(x, y))

if __name__ == "__main__":
    add_num(add, 2, 3)

装饰器公式

一个对象(函数)被装饰器装饰就相当于装饰器调用这个对象(函数),然后原来的对象(函数)相当于一个装饰器类型的对象

函数装饰器

class Timer:
    def __init__(self, func):
        self.func = func

    def __call__(self, *args, **kwargs):
        start = time.time()
        ret = self.func(*args, **kwargs)
        print(time.time() - start)
        return ret


@Timer
def add(x, y):
    return x + y

# 以上代码等价于 --> 装饰器调用这个函数,然后原来的函数相当于一个Timer实例
# add = Timer(add)
if __name__ == "__main__":
    print(add(2, 3))
    print(type(add))   # <class '__main__.Timer'>

带参数的函数装饰器

类装饰器

import time
class Timer:
    def __init__(self, func):
        self.func = func

    def __call__(self, *args, **kwargs):
        start = time.time()
        ret = self.func(*args, **kwargs)
        print(time.time() - start)
        return ret


@Timer
def add(x, y):
    return x + y


if __name__ == "__main__":
    print(add(2, 3))

带参数的类装饰器

class Timer:
    def __init__(self, prefix):
        self.prefix = prefix

    def __call__(self, func):
        def wrapper(*args,**kwargs):
            start = time.time()
            ret = func(*args, **kwargs)
            print(f"{self.prefix}{time.time() - start}")
            return ret
        return wrapper


@Timer(prefix="curr_time: ")
def add(x, y):
    return x + y

# 等价于
# add = Timer(prefix="curr_time: ")(add)


if __name__ == "__main__":
    print(add(2, 3))

类的装饰器

def add_str(cls):
    def __str__(self):
        return str(self.__dict__)

    cls.__str__ = __str__
    return cls


@add_str
class MyObject:
    def __init__(self, a, b):
        self.a = a
        self.b = b


# 等价于
# MyObject = add_str(MyObject)

if __name__ == "__main__":
    o = MyObject(1, 2)
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容