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()
    
  • 相关阅读:
    mysql 备份脚本
    (四)监控cpu
    (三)修改图形乱码问题
    (二)centos7安装zabbix agentd端
    (一)Centos7安装zabbix3.4 server端
    (五)条件测试
    (四)mysql数据类型
    (三)mysql数据库基本操作
    (二)mysql忘记root密码
    (五)cobbler自定义系统安装
  • 原文地址:https://www.cnblogs.com/hhh5460/p/6720889.html
Copyright © 2011-2022 走看看