Python装饰器简单说明

Posted 一WILLPOWER一

tags:

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

Python装饰器

官方定义

装饰器本质上是一个Python函数(其实就是闭包),它可以让其他函数在不需要做任何代码变动的前提下增加额外功能,装饰器的返回值也是一个函数对象。装饰器用于有以下场景,比如:插入日志、性能测试、事务处理、缓存、权限校验等场景。

参考链接

Python装饰器的通俗理解

三大要素

  1. 不能修改被装饰的函数的源代码
  2. 不能修改被装饰的函数的调用方式
  3. 满足1、2的情况下给程序增添功能

利用(函数+实参高阶函数+返回值高阶函数+嵌套函数+语法糖 = 装饰器)统一接口

(一定要记住的是,你当前使用的函数已经不是以前的函数了,而是返回的函数!)

如果要给装饰器带参数,需要再次增加一层函数, 并且层层返回!

被装饰函数不带参数

def func1(func):
    def dec0():
        print("start")
        func()
        print("end")
    return dec0
@func1
def func2():
    print("this is function2")
func2()

输出

start
this is function2
end

被装饰带参数

def func1(func):
    def dec0(a):
        print("start")
        func(a)
        print("end")
    return dec0
@func1
def func2(a):
    print("this is function2")
    print(a)

func2("参数1")
func2("参数2")
func2("参数3")

输出

start
this is function2
参数1
end
start
this is function2
参数2
end
start
this is function2
参数3
end

装饰器带参数

def func1(b):
    def dec0(func):
        def dec1(a):
            print(b)
            print("start")
            func(a)
            print("end")
        return dec1
    return dec0



@func1("装饰参数1")
def func2(a):
    print("this is function2")
    print(a)
func2("参数1")
func2("参数2")
func2("参数3")



@func1("装饰参数2")
def func2(a):
    print("this is function2")
    print(a)
func2("参数1")
func2("参数2")
func2("参数3")

输出

装饰参数1
start
this is function2
参数1
end
装饰参数1
start
this is function2
参数2
end
装饰参数1
start
this is function2
参数3
end
装饰参数2
start
this is function2
参数1
end
装饰参数2
start
this is function2
参数2
end
装饰参数2
start
this is function2
参数3
end

层层调用,层层返回,装饰器参数第一个解开,函数第二个解开,最后是函数参数

类装饰器

  • 函数对象了,类似C++中的仿函数, 实现__call__方法
  • 函数通过初始化对象传入
  • 返回的其实就是函数对象

被装饰函数不带参数

class dec:
    def __init__(self, func) -> None:
        self.func = func

    def __call__(self) -> None:
        print("start")
        self.func()
        print("end")


@dec
def func2():
    print("func2 is ok")


func2()

输出

start
func2 is ok
end

被装饰函数带参数

class dec:
    def __init__(self, func) -> None:
        self.func = func

    def __call__(self, args) -> None:
        print("start")
        print(args)
        self.func()
        print("end")


@dec
def func2():
    print("func2 is ok")


func2("参数1")
func2("参数2")
func2("参数3")

输出

start
参数1
func2 is ok
end
start
参数2
func2 is ok
end
start
参数3
func2 is ok
end

装饰器带参数

def fun1(name):
    class dec:
        def __init__(self, func) -> None:
            self.func = func

        def __call__(self, args) -> None:
            print(name)
            print("start")
            print(args)
            self.func()
            print("end")
    return dec


@fun1("装饰器参数1")
def func2():
    print("func2 is ok")


func2("参数1")
func2("参数2")
func2("参数3")

输出

装饰器参数1
start
参数1
func2 is ok
end
装饰器参数1
start
参数2
func2 is ok
end
装饰器参数1
start
参数3
func2 is ok
end

以上是关于Python装饰器简单说明的主要内容,如果未能解决你的问题,请参考以下文章

Python装饰器简单说明

Python装饰器

Python装饰器详解

python装饰器总结

python装饰器学习

Python 装饰器