首页 > 编程 > Python > 正文

深入浅出分析Python装饰器用法

2020-01-04 17:05:20
字体:
来源:转载
供稿:网友

本文实例讲述了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@itadef 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 wordprint(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()

 

希望本文所述对大家Python程序设计有所帮助。

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表