一个函数装饰器

简介:

Python的函数是对象

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

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

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

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

wKioL1mf0fuwPNHkAAK6GPgPjYw317.png-wh_50

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


def say():

    def hello():

        return 'hello'

    return hello

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

wKioL1mf3RuAY6NvAADR-K5E2aI540.png-wh_50


函数可以返回一个函数

wKiom1mf3SrRdF3ZAAIG15bbVfc046.png-wh_50


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

wKioL1mf3R6i2OmzAAE_g3Ew4zk685.png-wh_50


书写一个装饰器


def  oneDecorator(oneFunction):

def  oneWrapper():

print ‘before’

oneFunction()

print  ‘after’

return  oneWrapper


def  sayHello():

  print  ‘hello’


run  =  oneDecorator(sayHello)

run()


示例1

wKiom1mf3SvRm9B0AAEupAAUwqM283.png-wh_50

wKioL1mf3R-DqpRuAAC6cOnlSYA317.png-wh_50

示例2

wKiom1mf3S3z6iZ3AANhWB69G5Q966.png-wh_50


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

wKioL1mf3SGzZtjvAAIWJuoTpvg403.png-wh_50

wKiom1mf3TDRnPP0AAEDXQmENs8683.png-wh_50

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

run  =  towDecorator(oneDecorator(sayHello))

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

run()



装饰器传递参数

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

def  oneDecoration(oneFunction):

    def   wrapper(arg1, arg2):

        print(‘=’ * 50)

        oneFunction(arg1, arg2)

        print(‘=’ * 50)

    return  wrapper


示例

wKiom1mf37XzV0GGAAHa15Jm40c538.png-wh_50

wKioL1mf36jhBSO1AACMzwNHaRA463.png-wh_50


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


构建装饰器的时候,需要考虑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’)



wKiom1mf37bQAt87AAIS-ffGDss179.png-wh_50

wKiom1mf37eBMCxEAAERpI8-Hg4950.png-wh_50




装饰器一般格式


import   functools

def   装饰器名(fun):

    @functools.wraps(fun)

    def  wrapper(*args, **kwargs):

        dosomething

        fun(*args, **kwargs)

    return  wrapper


本文转自   tianshuai369   51CTO博客,原文链接:http://blog.51cto.com/songqinglong/1959364

相关文章
|
6月前
|
程序员 C语言
函数(1)
函数(1)
43 0
|
7月前
|
存储 C语言 Python
函数的前世今生1系列
函数的前世今生1系列
|
算法 编译器 程序员
|
编译器
函函函函函函函函函函函数——two
函函函函函函函函函函函数——two
95 0
函函函函函函函函函函函数——two
|
前端开发
纯函数
纯函数
81 0
基本初等函数 对数函数
基本初等函数 对数函数
134 0
|
编译器 C语言 C++
C++——函数
C++——函数
119 0
C++——函数
|
编译器
函数部分1
C的设计思想:把函数用作构建块。我们使用过标准库函数,如 printf() scanf()……现在我们进一步学习创建属于自己的函数模块。
124 0
|
JSON JavaScript 前端开发
6、函数
JavaScript 有三种声明函数的方法。
145 0