wxmg
论坛版主
论坛版主
  • UID5
  • 粉丝2
  • 关注0
  • 发帖数19
  • 社区居民
阅读:1963回复:1

python学习--装饰器

楼主#
更多 发布于:2015-12-06 14:42
在学习封装memcached的时候用到了装饰器,看视频有点绕,补充学习一下该知识点
1、模拟装饰器
    函数也是一个对象,可以当作参数传递,然后调用
def deco(func):
    print("myfun调用之前")
    func()
    print("myfun调用之后")
    return func
   
def myfunc():
    print("myfun被调用")
       
deco(myfunc)
执行结果如下:
myfun调用之前
myfun被调用
myfun调用之后
2、简单的使用装饰器
def deco(func):
    print("myfun调用之前")
    func()
    print("myfun调用之后")
    return func
   
@deco
def myfunc():
    print("myfun被调用")
       
myfunc()
编译完就直接自动执行了deco(func),并且myfunc()也执行了一次,但是myfunc()却没有调用deco(func),结果如下:
myfun调用之前
myfun被调用
myfun调用之后
myfun被调用

图片:1.gif




3、使用内嵌包装函数来确保每次函数myfunc()都能调用deco(func)
def deco(func):
    def _deco():
        print("myfun调用之前")
        func()
        print("myfun调用之后")
    return _deco
   
@deco
def myfunc():
    print("myfun被调用")
       
myfunc()
myfunc()
返回结果如下:
myfun调用之前
myfun被调用
myfun调用之后
myfun调用之前
myfun被调用
myfun调用之后
4、对带参数的函数进行装饰:
def deco(func):
    def _deco(a,b):
        print("myfun调用之前")
        ret=func(a,b)
        print("myfun调用之后,结果等于:%s"%ret)
    return _deco
   
@deco
def myfunc(a,b):
    print("myfun(%s,%s)被调用" %(a,b))
    return a+b
       
myfunc(1,2)
myfunc(3, 4)
返回结果如下:
myfun调用之前
myfun(1,2)被调用
myfun调用之后,结果等于:3
myfun调用之前
myfun(3,4)被调用
myfun调用之后,结果等于:7
4、对参数不定的函数进行装饰
def deco(func):
    def _deco(*args):
        print("%s调用之前" %(func.__name__))
        ret=func(*args)
        print("%s调用之后,结果等于:%s" %(func.__name__,ret))
    return _deco
   
@deco
def myfunc(a,b):
    print("myfun(%s,%s)被调用" %(a,b))
    return a+b
@deco
def myfunc2(a,b,c):
    print("myfun(%s,%s,%s)被调用" %(a,b,c))
    return a+b+c 
      
myfunc(1,2)
myfunc2(3, 4,5)
返回结果如下:
myfunc调用之前
myfun(1,2)被调用
myfunc调用之后,结果等于:3
myfunc2调用之前
myfun(3,4,5)被调用
myfunc2调用之后,结果等于:12
5、让装饰器带参数
    在装饰器里面再嵌套一个函数,并且需要先传递装饰器的参数,才能传递函数,实际执行应该是这个样子deco(arg,myfun(a,b))
def deco(arg):
    def _deco(func):
        def __deco(*args):
            print("deco参数是:%s,%s调用之前" %(arg,func.__name__))
            ret=func(*args)
            print("deco参数是:%s,%s调用之后,结果等于:%s" %(arg,func.__name__,ret))
        return __deco
    return _deco
   
@deco("参数1")
def myfunc(a,b):
    print("myfun(%s,%s)被调用" %(a,b))
    return a+b
@deco("参数2")
def myfunc2(a,b,c):
    print("myfun(%s,%s,%s)被调用" %(a,b,c))
    return a+b+c 
      
myfunc(1,2)
myfunc2(3, 4,5)
返回结果如下:
deco参数是:参数1,myfunc调用之前
myfun(1,2)被调用
deco参数是:参数1,myfunc调用之后,结果等于:3
deco参数是:参数2,myfunc2调用之前
myfun(3,4,5)被调用
deco参数是:参数2,myfunc2调用之后,结果等于:12
装饰器还有好多知识点,比如带 类 参数, 合法性验证等等。。
新手学习,请多指教

最新喜欢:

yanpengyanpen... wuwangyuwuwang...
shenyi
管理员
管理员
  • UID1
  • 粉丝29
  • 关注0
  • 发帖数564
沙发#
发布于:2015-12-13 23:35
不错。 很认真
会讲故事的程序员
游客

返回顶部