zoukankan      html  css  js  c++  java
  • python 装饰器

    1.在执行目标函数前附加一些内容或者功能:

    def demo(func):
        print('before exec %s '%func.__name__)
        func()
        print('after exec %s '%func.__name__)
        return func
    def func():
        print('hello world')
    
    func = demo(func)
    func()
    

    2.使用语法糖@来装饰函数

    def demo(func):
        print('before exec %s '%func.__name__)
        func()
        print('after exec %s '%func.__name__)
        return func
    @demo
    def func():
        print('hello world')
    func()
    

    3.使用内嵌包装饰函数保证每次新函数都被调用

    def demo(func):
        def inner():
            print('before exec %s '%func.__name__)
            func()
            print('after exec %s '%func.__name__)
        return inner
    @demo
    def func():
        print('hello world')
    func()
    

    4.对带参数的函数进行装饰

    def demo(func):
        def inner(a,b):
            print('before exec %s '%func.__name__)
            ret = func(a,b)
            print('after exec %s '%func.__name__)
            return ret
        return inner
    @demo
    def func(a,b):
        print('hello world')
        return a+b
    print(func(1,2))
    

    5.对参数数量不确定的函数进行装饰

    def demo(func):
        def inner(*args,**kwargs):
            print('before exec %s '%func.__name__)
            ret = func(*args,**kwargs)
            print('after exec %s '%func.__name__)
            return ret
        return inner
    @demo
    def func(a,b):
        print('hello world func')
        return a+b
    @demo
    def func1(a,b,c):
        print('hello world func1')
        return a+b+c
    print(func(1,2))
    print(func1(1,2,3))
    

    6.装饰器带参数

    def demo(arg):
        def warper(func):
            def inner(*args,**kwargs):
                print('before exec %s %s'%(func.__name__,arg))
                ret = func(*args,**kwargs)
                print('after exec %s %s '%(func.__name__,arg))
                return ret
            return inner
        return warper
    @demo('qq')
    def func(a,b):
        print('hello world func')
        return a+b
    @demo('wechat')
    def func1(a,b,c):
        print('hello world func1')
        return a+b+c
    print(func(1,2))
    print(func1(1,2,3))
    

    7.多个装饰器装饰一个函数

    def wrapper1(func):
        def inner():
            print('wrapper1 ,before func')
            func()
            print('wrapper1 ,after func')
        return inner
    
    def wrapper2(func):
        def inner():
            print('wrapper2 ,before func')
            func()
            print('wrapper2 ,after func')
        return inner
    
    @wrapper2
    @wrapper1
    def f():
        print('in f')
    
    f()

    8.装饰器带类参数

    '''''示例: 装饰器带类参数'''  
      
    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()  
            return __deco  
        return _deco  
     
    @deco(locker)  
    def myfunc():  
        print(" myfunc() called.")  
      
    myfunc()  
    myfunc()  
    

    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  
    

      

    '''''装饰器带类参数,并分拆公共类到其他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()  
        a.myfunc()  
        print(a.myfunc())  
        print(a.myfunc2(1, 2))  
        print(a.myfunc2(3, 4))  
    

      

  • 相关阅读:
    AutoResetEvent 2
    AutoResetEvent
    c++ 控制台输入参数
    C# .Net 多进程同步 通信 共享内存 内存映射文件 Memory Mapped
    filezilla管理网站服务器
    matlab
    WCF:无法满足对安全令牌的请求,因为身份验证失败。
    WCF 学习
    dev
    dotnetbar
  • 原文地址:https://www.cnblogs.com/Uncle-Guang/p/8890654.html
Copyright © 2011-2022 走看看