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

    用类作为装饰器

    练习一

    最初代码

    class bol(object):
      def __init__(self, func):
        self.func = func
        
      def __call__(self):
        return "<b>{}</b>".format(self.func())
    
    
    class ita(object):
      def __init__(self, func):
        self.func = func
        
      def __call__(self):
        return "<i>{}</i>".format(self.func())
    
    
    @bol
    @ita
    def sayhi():
      return 'hi'
    

    改进一

    class sty(object):
      def __init__(self, tag):
        self.tag = tag
        
      def __call__(self, f):
        def wraper():
          return "<{tag}>{res}</{tag}>".format(res=f(), tag=self.tag)
        return wraper
    
    @sty('b')
    @sty('i')
    def sayhi():
      return 'hi'
    

    改进二

    class sty(object):
      def __init__(self, *tags):
        self.tags = tags
        
      def __call__(self, f):
        def wraper():
          n = len(self.tags)
          return "{0}{1}{2}".format(('<{}>'*n).format(*self.tags), f(), ('</{}>'*n).format(*reversed(self.tags)))
        return wraper
    
    
    @sty('b', 'i')
    def sayhi():
      return 'hi'
      
    print(sayhi())
    

    改进三

    class sty(object):
      def __init__(self, *tags):
        self.tags = tags
        
      def __call__(self, f):
        def wraper(*args, **kwargs):
          n = len(self.tags)
          return "{0}{1}{2}".format(('<{}>'*n).format(*self.tags), f(*args, **kwargs), ('</{}>'*n).format(*reversed(self.tags)))
        return wraper
    
    
    @sty('b', 'i')
    def say(word='Hi'):
      return word
      
    print(say())
    print(say('Hello'))
    

    练习二

    最初代码

    import threading
    import time
    
    class DecoratorClass(object):
        def __init__(self):
            self.thread = None
    
        def __call__(self, func, *args, **kwargs):
            def wrapped_func(*args, **kwargs):
                curr_thread = threading.currentThread().getName()
                self.thread = curr_thread
                print('
    thread name before running func:', self.thread)
                ret_val = func()
                print('
    thread name after running func:', self.thread)
                return ret_val
    
            return wrapped_func
    
    @DecoratorClass()
    def decorated_with_class():
        print('running decorated w class')
        time.sleep(1)
        return
    
    threads = []
    for i in range(5):
        t = threading.Thread(target=decorated_with_class)
        threads.append(t)
        t.setDaemon(True)   # 守护
        t.start()
    

    改进:进程锁

    import threading
    import time
    
    class DecoratorClass(object):
        def __init__(self):
            self.thread = None
            self.lock = threading.Lock()
    
        def __call__(self, func, *args, **kwargs):
            def wrapped_func(*args, **kwargs):
    
                self.lock.acquire()
    
                curr_thread = threading.currentThread().getName()
                self.thread = curr_thread
    
                print('thread name before running func:', self.thread)
                ret_val = func()
                print('
    thread name after running func:', self.thread)
                
                self.lock.release()
                return ret_val
    
            return wrapped_func
    
    @DecoratorClass()
    def decorated_with_class():
        print('Let me sleep 1 second...')
        time.sleep(1)
        return
    
    threads = []
    for i in range(5):
        t = threading.Thread(target=decorated_with_class)
        threads.append(t)
        t.start()
    
  • 相关阅读:
    将一个单向链表逆序
    高精度加法
    从反汇编的角度看引用和指针的区别
    冒泡排序
    josephus(约瑟夫)问题
    获取每个进程可打开的最大文件数量
    AIX免费终端的获取
    [转] Linux应用层的定时器Timer
    POD(plain old data)
    char与wchar_t的区别
  • 原文地址:https://www.cnblogs.com/hhh5460/p/6720889.html
Copyright © 2011-2022 走看看