抽搐鸡

4.1 装饰器详解

一、装饰器介绍:

定义:本质是函数,作用是为其他函数添加附加功能

原则:【1】不能修改被装饰函数的源代码 【2】不能修改被装饰函数的调用方式

 

二、装饰器实现:

原理:【1】先通过高阶函数实现函数的包装修饰 【2】再通过内嵌函数+被装饰函数的定义变更,实现调用方式的保留

操作:

【第一层函数】通过高阶函数装饰

例:

现有函数

def test():

    print(“test”)

通过高阶函数方式执行test并额外打印“a":

def deco(func):

    func()

    print("a")

这样,执行deco(test)时,就会既执行test又打印了“a“

【第二层函数】通过内嵌函数+定义变更,实现调用方式的保留

如上述操作,若加多一条

test=deco(test)

那么只要执行

test

亦可达到同样的效果,但是test与test()还是有区别的,那么如何用test()来表达test呢?

只要再加一层函数即可:

def more(func):

    def deco():

      func()

      print("a")

    return deco

这时,若加test=more(test),则执行test(),即可达到想要的效果了

且python已经将底部代码包装,在被装饰函数上面写上:@more,即可起到执行前执行test=more(test)命令的效果

【第三层函数】第二层函数其实已经达到了想要的效果,这第三层函数是拓展型函数,可为装饰器本身传递函数,用来增加装饰器的可变性

如上面,在more()函数外再加一层函数more2:

def more2(a):

  def more(func):

      def deco():

        func()

        print("a")

      return deco

  return more

即可在装饰时传递函数,使用方式为:

@more2(a=3)

 

posted on 2018-08-22 16:28  抽搐鸡  阅读(119)  评论(0编辑  收藏  举报

导航