博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
一个函数装饰器
阅读量:7233 次
发布时间:2019-06-29

本文共 1491 字,大约阅读时间需要 4 分钟。

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

本文转自 菜鸟的征程 51CTO博客,原文链接:http://blog.51cto.com/songqinglong/1959364

转载地址:http://pnvfm.baihongyu.com/

你可能感兴趣的文章
.NET平台常用的框架整理
查看>>
使用EmbeddedValueResolverAware读取配置文件内容
查看>>
打印从1到最大的n位数
查看>>
drawnet.py绘制网络结构
查看>>
Javascript中apply、call、bind
查看>>
电脑显示U盘,可是读取不了
查看>>
Linux时间子系统之八:动态时钟框架(CONFIG_NO_HZ、tickless)
查看>>
LLVM/Clang
查看>>
九周 项目 1
查看>>
南昌互联网行业协会筹办者祝真和华罡团队-2014年12月江西IDC排行榜
查看>>
二叉树搜索
查看>>
redis的有序集合ZSET(stored set)
查看>>
C++获取时间的方法
查看>>
Android隐藏输入法键盘(hideSoftInputFromInputMethod没有效果)
查看>>
Linux USB驱动数据结构
查看>>
PKI(公钥基础设施)基础知识笔记
查看>>
tiny4412 裸机程序 一、说明【转】
查看>>
CSS自己主动换行、强制不换行、强制断行、超出显示省略号
查看>>
18-hadoop-weather案例
查看>>
Vue模板内容
查看>>