博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
python装饰器 练习
阅读量:6953 次
发布时间:2019-06-27

本文共 2852 字,大约阅读时间需要 9 分钟。

用类作为装饰器

练习一

最初代码

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

改进一

class sty(object):  def __init__(self, tag):    self.tag = tag      def __call__(self, f):    def wraper():      return "<{tag}>{res}
".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 threadingimport timeclass 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('\nthread name before running func:', self.thread)            ret_val = func()            print('\nthread 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)    returnthreads = []for i in range(5):    t = threading.Thread(target=decorated_with_class)    threads.append(t)    t.setDaemon(True)   # 守护    t.start()

改进:进程锁

import threadingimport timeclass 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('\nthread 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)    returnthreads = []for i in range(5):    t = threading.Thread(target=decorated_with_class)    threads.append(t)    t.start()

转载地址:http://drjil.baihongyu.com/

你可能感兴趣的文章
实际工作中遇到的技术难题与大家交流(工作流条件表达式计算部分),希望技术高手能给于指点...
查看>>
Yii 2 —— 记住密码
查看>>
javascript面向对象技术基础(六)
查看>>
HBase-1.0.1学习笔记(八)启动脚本解析
查看>>
Spring学习笔记AOP(四)
查看>>
运维工程师的职责和前景(下)
查看>>
Qt学习:QDomDocument
查看>>
复制本贴地址传给QQ/MSN好友的代码
查看>>
Nodejs的HTTP服务器
查看>>
thinkphp-execute
查看>>
bootstrap-缩略图-默认样式的实例
查看>>
Spring4-BeanPropertyRowMapper
查看>>
我的友情链接
查看>>
MongoDB根据时间aggregate示例
查看>>
等级保护项目SQL Server审计方案
查看>>
Java 之集合
查看>>
改进了一下上周写的那个加域和迁移用户资料的程序
查看>>
归并排序和快速排序的衍生问题
查看>>
web工具
查看>>
Iptables 规则基础笔记
查看>>