首页 > 编程 > Python > 正文

九步学会Python装饰器

2020-02-23 01:08:35
字体:
来源:转载
供稿:网友

本文实例讲述了Python装饰器。分享给大家供大家参考。具体分析如下:

这是在Python学习小组上介绍的内容,现学现卖、多练习是好的学习方式。
第一步:最简单的函数,准备附加额外功能

# -*- coding:gbk -*-'''示例1: 最简单的函数,表示调用了两次'''def myfunc():  print("myfunc() called.")myfunc()myfunc()

第二步:使用装饰函数在函数执行前和执行后分别附加额外功能

# -*- coding:gbk -*-'''示例2: 替换函数(装饰)装饰函数的参数是被装饰的函数对象,返回原函数对象装饰的实质语句: myfunc = deco(myfunc)''' def deco(func):  print("before myfunc() called.")  func()  print(" after myfunc() called.")  return funcdef myfunc():  print(" myfunc() called.")myfunc = deco(myfunc)myfunc()myfunc()

第三步:使用语法糖@来装饰函数

# -*- coding:gbk -*-'''示例3: 使用语法糖@来装饰函数,相当于“myfunc = deco(myfunc)”但发现新函数只在第一次被调用,且原函数多调用了一次''' def deco(func):  print("before myfunc() called.")  func()  print(" after myfunc() called.")  return func@decodef myfunc():  print(" myfunc() called.")myfunc()myfunc()

第四步:使用内嵌包装函数来确保每次新函数都被调用

# -*- coding:gbk -*-'''示例4: 使用内嵌包装函数来确保每次新函数都被调用,内嵌包装函数的形参和返回值与原函数相同,装饰函数返回内嵌包装函数对象''' def deco(func):  def _deco():    print("before myfunc() called.")    func()    print(" after myfunc() called.")    # 不需要返回func,实际上应返回原函数的返回值  return _deco@decodef myfunc():  print(" myfunc() called.")  return 'ok'myfunc()myfunc()

第五步:对带参数的函数进行装饰

# -*- coding:gbk -*-'''示例5: 对带参数的函数进行装饰,内嵌包装函数的形参和返回值与原函数相同,装饰函数返回内嵌包装函数对象'''def deco(func):  def _deco(a, b):    print("before myfunc() called.")    ret = func(a, b)    print(" after myfunc() called. result: %s" % ret)    return ret  return _deco@decodef myfunc(a, b):  print(" myfunc(%s,%s) called." % (a, b))  return a + bmyfunc(1, 2)myfunc(3, 4)

第六步:对参数数量不确定的函数进行装饰

# -*- coding:gbk -*-'''示例6: 对参数数量不确定的函数进行装饰,参数用(*args, **kwargs),自动适应变参和命名参数'''def deco(func):  def _deco(*args, **kwargs):    print("before %s called." % func.__name__)    ret = func(*args, **kwargs)    print(" after %s called. result: %s" % (func.__name__, ret))    return ret  return _deco@decodef myfunc(a, b):  print(" myfunc(%s,%s) called." % (a, b))  return a+b@decodef myfunc2(a, b, c):  print(" myfunc2(%s,%s,%s) called." % (a, b, c))  return a+b+cmyfunc(1, 2)myfunc(3, 4)myfunc2(1, 2, 3)myfunc2(3, 4, 5)            
发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表