zoukankan      html  css  js  c++  java
  • 语法糖

    '''''示例1: 使用语法糖@来装饰函数,相当于“myfunc = fun1(myfunc)”
    但发现新函数只在第一次被调用,且原函数多调用了一次'''
    def fun1(func):
    print("before")
    func() #第一次调用
    print("after")
    # def func():
    # pass
    return func#第二次调用
    @fun1
    def myfunc():
    print("myfunc() called")
    myfunc()#会调用fun1
    myfunc()#不会调用fun1
    '''''示例2: 使用内嵌包装函数来确保每次新函数都被调用,
    内嵌包装函数的形参和返回值与原函数相同,装饰函数返回内嵌包装函数对象'''
    def deco(func):
    def _deco():
    print("before ")
    func()
    print(" after")
    # 不需要返回func,实际上应返回原函数的返回值
    return _deco
    @deco
    def myfunc():
    print(" myfunc() called.")
    return 'ok'
    myfunc()
    myfunc()
    '''''示例3: 对带参数的函数进行装饰,
    内嵌包装函数的形参和返回值与原函数相同,装饰函数返回内嵌包装函数对象'''
    def fun1(func):
    def _deco(a,b):
    print("before")
    ref=func(a,b)
    print("end")
    # 此处的返回值等同于myfun1的返回值,不写就不会调用myfun1的返回值
    return ref
    return _deco
    @fun1
    def myfun1(a,b):
    print("+++++")
    return a+b
    k=myfun1(1,2)
    print(k)
    myfun1(1,2)
    '''''示例4: 对参数数量不确定的函数进行装饰,
    参数用(*args, **kwargs),自动适应变参和命名参数'''
    def deco(func):
    def _deco(*args,**kwargs):#此处只是参数
    print("begin")
    rs=func(*args,**kwargs)
    print("end")
    return rs
    return _deco
    @deco
    def myfunc(a,b):
    print(" myfunc(%s,%s) called." % (a, b))
    return a+b
    myfunc(1,2)
    myfunc(2,2)
    print(myfunc(5,6))
    @deco
    def myfunc1(a,b,c):
    print(" myfunc2(%s,%s,%s) called." % (a, b, c))
    return a+b+c
    myfunc1(1,2,1)
    myfunc1(1,2,3)
    '''''示例5: 在示例2的基础上,让装饰器带参数,
    和上一示例相比在外层多了一层包装。
    装饰函数名实际上应更有意义些'''
    def deco(arg):
    def _deco(func):#此处和实例4一样,就是在外面加了一层
    def _deco():
    print("before %s called [%s]." % (func.__name__, arg))
    func()
    print(" after %s called [%s]." % (func.__name__, arg))
    return _deco
    return _deco
    @deco('mymodul')
    def myfunc():
    print("++++++")

    @deco("module2")
    def myfunc2():
    print(" myfunc2() called.")
    myfunc()
    myfunc2()
    '''''示例6: 装饰器带类参数'''


    class locker:
    def __init__(self):
    print("locker.__init__() should be not called.")

    @staticmethod
    def acquire():
    print("locker.acquire() called.(这是静态方法)")

    @staticmethod
    def release():
    print(" locker.release() called.(不需要对象实例)")


    def deco(cls):
    '''''cls 必须实现acquire和release静态方法''' #好像可以不写,不写也不报错
    def _deco(func):
    def __deco():
    print("before %s called [%s]." % (func.__name__, cls))
    # cls.acquire()
    try:
    return func()
    finally:
    # cls.release()
    pass # 不实现好像也不报错
    return __deco
    return _deco
    @deco(locker)
    def myfunc():
    print(" myfunc() called.")
    myfunc()
    myfunc()

    # 装饰器带类参数,并分拆公共类到其他py文件中,同时演示了对一个函数应用多个装饰器
    # '''''mylocker.py: 公共类 for 示例9.py'''
    class mylocker:
    def __init__(self):
    print("mylocker.__init__() called.")

    @staticmethod
    def acquire():
    print("mylocker.acquire() called.")

    @staticmethod
    def unlock():
    print(" mylocker.unlock() called.")


    class lockerex(mylocker):
    @staticmethod
    def acquire():
    print("lockerex.acquire() called.")

    @staticmethod
    def unlock():
    print(" lockerex.unlock() called.")


    def lockhelper(cls):
    '''''cls 必须实现acquire和release静态方法'''

    def _deco(func):
    def __deco(*args, **kwargs):
    print("before %s called." % func.__name__)
    cls.acquire()
    try:
    return func(*args, **kwargs)
    finally:
    cls.unlock()

    return __deco

    return _deco

    # -*- coding:gbk -*-
    '''''示例9: 装饰器带类参数,并分拆公共类到其他py文件中
    同时演示了对一个函数应用多个装饰器'''
    # 应该是两个容器先执行上半部分-》执行主要函数-》在执行下班部分-》返回值
    # from mylocker import *


    class example:
    @lockhelper(mylocker)
    def myfunc(self):
    print(" myfunc() called.")

    @lockhelper(mylocker)
    @lockhelper(lockerex)
    def myfunc2(self, a, b):
    print(" myfunc2() called.")
    return a + b


    if __name__ == "__main__":
    a = example()
    print("11111111111111")
    a.myfunc()
    print("12222222222221")
    print(a.myfunc())
    print("133333333333331")
    print(a.myfunc2(1, 2))
    print("1444444444411")
    print(a.myfunc2(3, 4))
    参考自:http://blog.csdn.net/dreamcoding/article/details/8611578
  • 相关阅读:
    人月神话阅读笔记01
    个人每日总结14
    个人每日总结13
    个人每日总结12
    个人每日总结11
    个人每日总结10
    个人每日总结9
    第五周学习进度表
    梦断代码阅读笔记
    05构建之法阅读笔记之五
  • 原文地址:https://www.cnblogs.com/qieyu/p/7853817.html
Copyright © 2011-2022 走看看