码迷,mamicode.com
首页 > 其他好文 > 详细

一个函数装饰器

时间:2017-08-25 17:48:03      阅读:130      评论:0      收藏:0      [点我收藏+]

标签:装饰器

Python的函数是对象

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

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

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

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

技术分享

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


def say():

    def hello():

        return ‘hello‘

    return hello

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

技术分享


函数可以返回一个函数

技术分享


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

技术分享


书写一个装饰器


def  oneDecorator(oneFunction):

def  oneWrapper():

print ‘before’

oneFunction()

print  ‘after’

return  oneWrapper


def  sayHello():

  print  ‘hello’


run  =  oneDecorator(sayHello)

run()


示例1

技术分享

技术分享

示例2

技术分享


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

技术分享

技术分享

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

run  =  towDecorator(oneDecorator(sayHello))

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

run()



装饰器传递参数

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

def  oneDecoration(oneFunction):

    def   wrapper(arg1, arg2):

        print(‘=’ * 50)

        oneFunction(arg1, arg2)

        print(‘=’ * 50)

    return  wrapper


示例

技术分享

技术分享


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


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



技术分享

技术分享




装饰器一般格式


import   functools

def   装饰器名(fun):

    @functools.wraps(fun)

    def  wrapper(*args, **kwargs):

        dosomething

        fun(*args, **kwargs)

    return  wrapper




本文出自 “骑猪去旅行” 博客,请务必保留此出处http://songqinglong.blog.51cto.com/7591177/1959364

一个函数装饰器

标签:装饰器

原文地址:http://songqinglong.blog.51cto.com/7591177/1959364

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!