python装饰器

装饰器本质是一个装饰器函数,在不改变一个函数的函数体本身的情况下,实现函数体本身外其他的功能
1.实现一个装饰器
def  logger(fn):                         #装饰器函数必须只能传入一个参数,那就是被装饰函数
    print(‘in’)
    def wrapper(*args,**kwargs):
        print(‘before’)
        ret = fn(*args,**kwargs)
        print(‘after’)
        return ret
    return wrapper
@logger
def foo3(x=3,y=4):       #相当于   foo3=logger(foo3)
    ”’i’m foo3”’
    print(x,y)
 代码在加载时就会打印  ‘in’
执行foo3函数相当于执行下面的函数    执行foo3(参数) ,args 和kwargs会获取实际输入的位置参数和关键字参数,然后传给原函数中调用(它不会获取原函数中的默认参数值,但这不会改变函数执行结果).
def wrapper(*args,**kwargs):
    print(‘before’)
    ret = foo3(*args,**kwargs)
    print(‘after’)
    return ret
2.文档字符串 和 带参数的装饰器
一个函数定义之后就会有对应的文档字符(.__doc__)等属性生成. 装饰器函数包装过后,获取不到原函数的各种属性就变成了wrapper对应的属性
下面使用了一个带有参数的装饰器把wrapper 函数装饰成一个新的wrapper函数,这里使用到了一个带有参数的装饰器
代码2.1:
def copy_properties(src):
    def _copy(dst):
        dst.__name__ = src.__name__
        dst.__doc__ = src.__doc__
        return dst
    return _copy
def logger(fn):
    @copy_properties(fn)          # wrapper = wrapper(fn)(wrapper)
    def wrapper(*args,**kwargs):
         ‘I am wrapper’
        print(‘begin’)
        x = fn(*args,**kwargs)
        print(‘end’)
        return x
     return wrapper
@logger            #add = logger(add)
 def add(x,y):
     ”’This is a function for add”’
         return x + y
 print(“name={}, doc={}”.format(add.__name__, add.__doc__))
代码2.2:
def copy_property(src):
    def _copy(dst):
        print(11)
        dst.__name__ = src.__name__
        dst.__doc__ = src.__doc__
        return dst
    return _copy
def add(x,y):
    ”’i am add”’
    print(x,y)
    return x+y
@copy_property(add)
def wrapper(*args,**kwargs):        #wrapper = cop_property(add) (wrapper)
    ”’i am wrapper”’
    print(22)
    ret = add(*args,**kwargs)
    return ret
print(add.__name__,add.__doc__)
print(wrapper.__name__,wrapper.__doc__)
运行代码2.2  会加载装饰器 运行右边的 wrapper = cop_property(add) (wrapper) 程序  ,add的属性会赋给 wrapper,打印如下.
11                                                                  如果执行wrapper(2,3)  会 先打印 22,然后执行add中的过程
add i am add
add i am add
3.对一个函数使用多个装饰器
def decorator1(func):
    print(11)
    def wrapper1(*args,**kwargs):
        print(‘hello python 之前’)
        ret=func(*args,**kwargs)
        return ret
    return wrapper1
def decorator2(func):
    print(22)
    def wrapper2(*args,**kwargs):
        print(‘hello python 之后’)
        ret=func(*args,**kwargs)
        return ret
    return wrapper2
@decorator1
@decorator2
def test(x,y):
    print(‘hello python!’,x,y)
test(4,5)
22                                         对一个函数执行多个装饰器,执行结果相当于对decorator2装饰test的函数 再使用decorator1装饰它
11
hello python 之前
hello python 之后
hello python! 4 5

本文来自投稿,不代表Linux运维部落立场,如若转载,请注明出处:http://www.178linux.com/88032

(0)
daishitongdaishitong
上一篇 2017-10-23
下一篇 2017-10-23

相关推荐

  • 马哥教育网络班22期+第3周课程练习

    1、列出当前系统上所有已经登录的用户的用户名,注意:同一个用户登录多次,则只显示一次即可。    [test2@localhost ~]$ who |cut -d " " -f1|sort -u   &nbsp…

    Linux干货 2016-08-30
  • 第十五周作业

    1、总结sed和awk的详细用法; sed:     模式空间:sed是一种在线编辑器、行编辑器,一次处理一行内容,在处理时,把当前处理的行存储在临时缓冲区当中,并在该缓冲区中完成后续的处理,该缓冲区被称为”模式空间”。     保持空间:在模式空间中处理完一行内容后会继续处理下一行,但是对于处…

    Linux干货 2017-04-18
  • 运维工程师技能需求排行

    这是我今天在拉勾网搜索运维,翻完了4四页也招聘信息之后得到的,我的目的是想要看看之后的学习,哪个更应该成为重点,有些在我意料之中,有些还真的没想到,算是努力了一个小时的收获吧,分享给大家。
    注意:其中的看法仅代表个人观点,很多都是依靠我自己的学习经验和工作经验累积的

    Linux干货 2017-12-12
  • Linux平台的4个最佳开源代码编辑器

    原文出处: Abhishek   译文出处:Linux中国 su-kaiyao   正在寻找Linux平台最棒的代码编辑器?如果你询问那些很早就玩Linux的人,他们会回答是Vi, Vim, Emacs, Nano等。但是,我今天不讨论那些。我将谈论一些新时代尖端、漂亮、时髦而且十分强大, 功能丰富…

    Linux干货 2015-03-02
  • Gdevops 2017全球敏捷运维峰会【上海站】

    Gdevops-2017全球敏捷运维峰会-上海将于7月7日举行,活动家提供Gdevops 2017全球敏捷运维峰会【上海】在线报名服务。 峰会介绍 Introduction 全球敏捷运维峰会 数据已经成为企业的核心竞争力!谁掌控数据、更好的利用数据、实现资产化,谁就会真正率先进入大数据时代。 中国数据资产管理峰会DAMS2017,连续三年站在数据时…

    Linux干货 2017-06-27
  • linux基础学习之AWK

    内容: 1、awk输出(print、printf) 2、awk变量(内建变量和定义变量) 3、awk数组 4、awk重定向输出 5、awk操作符 6、awk常见模式类型 7、awk控制及循环语句 8、awk内置函数 awk:(其名称得自于它的创始人 Alfred Aho 、Peter Weinberger 和 Brian Kernighan 姓氏的首个字母)…

    Linux干货 2016-09-22