Python装饰器的专业解释

装饰器,其实是用到了闭包的原理来进行操作的。

单个装饰器:

以下是一个简单的例子:

def outer(func):
    print("OUTER enter ...")

    def wrapper(*args, **kwargs):
        print("调用之前......")
        result = func(*args, **kwargs)
        print("调用之后......")
        return result

    print("OUTER leave ...")
    return wrapper


@outer
def my_hello():
    print("hello world")

上面的代码可以运行出结果:

这个时候就会把这个闭包创建出来。

当我们调用my_hello函数的时候,会进行执行wrapper里的代码:

def outer(func):
    print("OUTER enter ...")

    def wrapper(*args, **kwargs):
        print("调用之前......")
        result = func(*args, **kwargs)
        print("调用之后......")
        return result

    print("OUTER leave ...")
    return wrapper


@outer
def my_hello():
    print("hello world")


my_hello()

调用原理:

等价于:

def outer(func):
    print("OUTER enter ...")

    def wrapper(*args, **kwargs):
        print("调用之前......")
        result = func(*args, **kwargs)
        print("调用之后......")
        return result

    print("OUTER leave ...")
    return wrapper


# @outer
def my_hello():
    print("hello world")


my_hello = outer(my_hello)
my_hello()

多重装饰器修饰:

def outer1(func):
    print("OUTER enter ...1")

    def wrapper(*args, **kwargs):
        print("调用之前......1")
        result = func(*args, **kwargs)
        print("调用之后......1")
        return result

    print("OUTER leave ...1")
    return wrapper


def outer2(func):
    print("OUTER enter ...2")

    def wrapper(*args, **kwargs):
        print("调用之前......2")
        result = func(*args, **kwargs)
        print("调用之后......2")
        return result

    print("OUTER leave ...2")
    return wrapper


@outer1
@outer2
def my_hello():
    print("hello world")

打印的结果如下:

调用的时候:

def outer1(func):
    print("OUTER enter ...1")

    def wrapper(*args, **kwargs):
        print("调用之前......1")
        result = func(*args, **kwargs)
        print("调用之后......1")
        return result

    print("OUTER leave ...1")
    return wrapper


def outer2(func):
    print("OUTER enter ...2")

    def wrapper(*args, **kwargs):
        print("调用之前......2")
        result = func(*args, **kwargs)
        print("调用之后......2")
        return result

    print("OUTER leave ...2")
    return wrapper


@outer1
@outer2
def my_hello():
    print("hello world")


my_hello()

运行结果为:

调用原理:

def outer1(func):
    print("OUTER enter ...1")

    def wrapper(*args, **kwargs):
        print("调用之前......1")
        result = func(*args, **kwargs)
        print("调用之后......1")
        return result

    print("OUTER leave ...1")
    return wrapper


def outer2(func):
    print("OUTER enter ...2")

    def wrapper(*args, **kwargs):
        print("调用之前......2")
        result = func(*args, **kwargs)
        print("调用之后......2")
        return result

    print("OUTER leave ...2")
    return wrapper


# @outer1
# @outer2
def my_hello():
    print("hello world")


my_hello = outer2(my_hello)
my_hello = outer1(my_hello)

my_hello()

运行结果如下:

相关推荐

  1. python装饰作用

    2023-12-30 23:58:02       19 阅读
  2. python装饰使用

    2023-12-30 23:58:02       17 阅读
  3. python装饰简单使用

    2023-12-30 23:58:02       37 阅读
  4. python装饰,例子说明

    2023-12-30 23:58:02       8 阅读
  5. 理解Python装饰 decorator

    2023-12-30 23:58:02       11 阅读
  6. python装饰用法

    2023-12-30 23:58:02       8 阅读
  7. Python装饰

    2023-12-30 23:58:02       41 阅读

最近更新

  1. TCP协议是安全的吗?

    2023-12-30 23:58:02       16 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2023-12-30 23:58:02       16 阅读
  3. 【Python教程】压缩PDF文件大小

    2023-12-30 23:58:02       15 阅读
  4. 通过文章id递归查询所有评论(xml)

    2023-12-30 23:58:02       18 阅读

热门阅读

  1. Android 循环滚动的列表-类似弹幕效果

    2023-12-30 23:58:02       38 阅读
  2. pycharm 运行setup.py

    2023-12-30 23:58:02       36 阅读
  3. .Net Core 防御XXS攻击

    2023-12-30 23:58:02       41 阅读
  4. Fastboot指令大全

    2023-12-30 23:58:02       40 阅读
  5. 学习记录.spring中的单例bean是线程安全的吗?

    2023-12-30 23:58:02       40 阅读
  6. Parameter ‘username‘ unfilled

    2023-12-30 23:58:02       32 阅读
  7. 学习记录——BiSeNet V2

    2023-12-30 23:58:02       32 阅读
  8. servlet总结

    2023-12-30 23:58:02       32 阅读
  9. 保龄球游戏的获胜者(LeetCode日记)

    2023-12-30 23:58:02       22 阅读
  10. ubuntu装机记录

    2023-12-30 23:58:02       41 阅读
  11. 说一下数据库的事务隔离?

    2023-12-30 23:58:02       38 阅读
  12. 【用pandas,写入内容到excel工作表的问题】

    2023-12-30 23:58:02       42 阅读
  13. LeetCode[141] [142] 环形链表I II

    2023-12-30 23:58:02       42 阅读