美文网首页
装饰器1

装饰器1

作者: 闲云野鹤_23dd | 来源:发表于2021-01-26 17:00 被阅读0次

开放封闭原则

讲装饰器之前我们先来了解一下开放封闭原则

开放封闭原则:软件实体应该是可扩展,而不可修改的。也就是说,对扩展是开放的,而对修改是封闭的。

装饰器的作用:
在不更改原功能函数内部代码,并且不改变调用方法的情况下为原函数添加新的功能。

@语法糖

def fun_a(func):
    print('原方法返回值:',func())
    return 'hello'

@fun_a  # 这种写法,等价于  fun_b=fun_a(fun_b)
def fun_b():  
    return '123'

print(fun_b)

# 输出结果
# 原方法返回值: 123
# hello` 

根据上例,我们可以看到,被@fun_a装饰的函数fun_b,不在是原来的函数了,而是被替换成fun_a()函数的返回值。即如果装饰器函数的返回值为普通变量,那么被修饰的函数名就变成了变量名;同样,如果装饰器返回的是一个函数的名称,怎么被修饰的函数名依然表示一个函数。

实际上,所谓函数装饰器,就是通过装饰器函数,在不修改原函数的前提下,来对函数的功能进行合理的扩充。

结合闭包函数实现装饰器

看下边的例子:

def fun_a(func): # fun_b函数的地址
    def function():
        print("函数执行前的操作")
        res = func() # 调用fun_b函数
        print("函数执行之后的操作")
        return res # 返回fun_b()函数的返回值
    return function # 返回闭包内层函数地址,方便用户调用

@fun_a  # 这种写法,等价于  fun_b=fun_a(fun_b)
def fun_b():
    print("执行fun_b函数")

fun_b()  # 实际上执行的是装饰器内层函数function` 

解析上述例子的执行逻辑:

  1. @fun_a语法糖,相当于把fun_b的地址当做参数给到fun_a函数的func变量;并执行fun_a函数,把内层函数的地址返回,此时fun_b存的是装饰器内层函数的地址
  2. fun_b() 相当于调用装饰器内层函数,先打印了函数执行前的操作
  3. 然后执行了原来的fun_b函数,打印执行fun_b函数,并把该函数的返回值存到了res变量中
  4. 打印了函数执行之后的操作
  5. 返回res

所以最终的执行结果如下:

函数执行前的操作
执行fun_b函数
函数执行之后的操作

相关文章

  • Python装饰器

    Python装饰器 一、函数装饰器 1.无参装饰器 示例:日志记录装饰器 2.带参装饰器 示例: 二、类装饰器 示例:

  • python——装饰器详解

    一、装饰器概念 1、装饰器 装饰器:一种返回值也是一个函数的函数,即装饰器。 2、装饰器目的 装饰器的目的:装饰器...

  • 11 python 中的装饰器

    1 装饰器相关的概念 本质:装饰器的本质就是函数 功能:装饰器的功能是给其他函数添加装饰 实现装饰器的原则:(1)...

  • python3基础---详解装饰器

    1、装饰器原理 2、装饰器语法 3、装饰器执行的时间 装饰器在Python解释器执行的时候,就会进行自动装饰,并不...

  • python之装饰器模版

    装饰器的作用:装饰器即可以装饰函数也可以装饰类。装饰器的原理:函数也是对象 1.定义装饰器 2.使用装饰器假设de...

  • python装饰器

    1.装饰器 2.带装饰器的参数

  • 第012篇:三大神器之装饰器

    Python的三大神器:装饰器、迭代器、生成器 1、装饰器  1.1、什么是装饰器 装饰器的本质是一个函数 = 返...

  • 装饰器

    1、装饰器的本质是函数,主要用来装饰其他函数,为其他函数添加附加功能 2、装饰器的原则: (1) 装饰器不能修改被...

  • 1 装饰器

    1 看了一天还是有些迷糊,先把资料mark下,后面熟悉了再继续研究。 http://www.cnblogs.com...

  • 装饰器1

    开放封闭原则 讲装饰器之前我们先来了解一下开放封闭原则 开放封闭原则:软件实体应该是可扩展,而不可修改的。也就是说...

网友评论

      本文标题:装饰器1

      本文链接:https://www.haomeiwen.com/subject/ofwfaktx.html