Python的函数是对象

Python  函数可以被赋值def  hello():print(‘hello!’)

a = hello       #注: 此处没有() ,是一个对象

a()        # 调用a() 结果与hello() 相同

此时删除 helloa() 依然保持原属性

一个函数装饰器_装饰器

函数可以定义在另一个函数里面


def say():

    def hello():

        return 'hello'

    return hello

外层的say函数会把内层的 hello函数的执行结果输出

一个函数装饰器_Python_02


函数可以返回一个函数

一个函数装饰器_装饰器_03


可以将一个函数当作参数传递

一个函数装饰器_Python_04


书写一个装饰器


def  oneDecorator(oneFunction):

def  oneWrapper():

print ‘before’

oneFunction()

print  ‘after’

return  oneWrapper


def  sayHello():

  print  ‘hello’


run  =  oneDecorator(sayHello)

run()


示例1

一个函数装饰器_Python_05

一个函数装饰器_Python_06

示例2

一个函数装饰器_Python_07


装饰器经典模式à累加装饰器

一个函数装饰器_装饰器_08

一个函数装饰器_装饰器_09

上例通过函数直接调用可写成

run  =  towDecorator(oneDecorator(sayHello))

注:被装饰的函数不写括号,代表返回的是一个对象,然后通过对象()的方式运行

run()



装饰器传递参数

只需要让包装函数传递参数即可

def  oneDecoration(oneFunction):

    def   wrapper(arg1, arg2):

        print(‘=’ * 50)

        oneFunction(arg1, arg2)

        print(‘=’ * 50)

    return  wrapper


示例

一个函数装饰器_Python_10

一个函数装饰器_Python_11


使用装饰器装饰一个类中的方法


构建装饰器的时候,需要考虑self,所以在传参的时候,包装函数除了需要传递函数的参数,还要传递一个self参数

例:

def  oneDecration(onefunction):

    def  wrapper(self, args1, args2):

        print(‘=’* 50)

      oneFunction(self, args1, args2)

      print(‘=’ * 50)

    return  wrapper


其它与上例无异,这里不再作演示



一个更为通用的装饰器


def  oneDecration(onefunction):

    def  wrapper(*args,  **kwargs):

         print(‘=’ * 50)

      oneFunction(*args, **kwargs)

      print(‘=’ * 50)

    return  wrapper

@oneDecration

def  sayHello(name1, name2, name3):

      print(‘{}: hello, {}, {}’.format(name1,name2,name3))

@oneDecration

def  sayHello1():

    print(‘hello’)

sayHello1()

sayHello(‘Tom’,‘Jerry’, ‘Jim’)



一个函数装饰器_Python_12

一个函数装饰器_装饰器_13




装饰器一般格式


import   functools

def   装饰器名(fun):

    @functools.wraps(fun)

    def  wrapper(*args, **kwargs):

        dosomething

        fun(*args, **kwargs)

    return  wrapper