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

 更新时间:2017年07月28日 10:12:31   作者:罗兵  
这篇文章主要介绍了Python装饰器用法,结合实例形式对比分析了Python装饰器的定义与使用技巧,需要的朋友可以参考下

本文实例讲述了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('\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)
  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('\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)
  return
threads = []
for i in range(5):
  t = threading.Thread(target=decorated_with_class)
  threads.append(t)
  t.start()

更多关于Python相关内容可查看本站专题:《Python数据结构与算法教程》、《Python Socket编程技巧总结》、《Python函数使用技巧总结》、《Python字符串操作技巧汇总》及《Python入门与进阶经典教程

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

相关文章

  • Python抓取框架 Scrapy的架构

    Python抓取框架 Scrapy的架构

    这篇文章主要为大家详细介绍了Python抓取框架,针对Scrapy的架构进行分析,感兴趣的小伙伴们可以参考一下
    2016-08-08
  • Python+Matplotlib绘制双y轴图像的示例代码

    Python+Matplotlib绘制双y轴图像的示例代码

    这篇文章主要介绍了如何利用python的matplotlib绘制双Y轴图像,文中有非常详细的代码示例,对正在学习python的小伙伴们有很好地帮助,需要的朋友可以参考下
    2022-04-04
  • seaborn绘制双变量联合分布图示例详解

    seaborn绘制双变量联合分布图示例详解

    这篇文章主要为大家介绍了seaborn绘制双变量联合分布图示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-12-12
  • 解决python 找不到module的问题

    解决python 找不到module的问题

    今天小编就为大家分享一篇解决python 找不到module的问题,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-02-02
  • 小小聊天室Python代码实现

    小小聊天室Python代码实现

    这篇文章主要为大家详细介绍了小小聊天室Python具体的实现代码,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2016-08-08
  • Python sys模块中maxsize()方法教程示例

    Python sys模块中maxsize()方法教程示例

    这篇文章主要为大家介绍了Python sys模块中maxsize()方法教程示例,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-09-09
  • 在Python 3中实现类型检查器的简单方法

    在Python 3中实现类型检查器的简单方法

    这篇文章主要介绍了在Python 3中实现类型检查器的简单方法,包括对函数注解这个新特性的介绍,需要的朋友可以参考下
    2015-07-07
  • python游戏地图最短路径求解

    python游戏地图最短路径求解

    这篇文章主要为大家详细介绍了python游戏地图最短路径的求解,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-01-01
  • Django中的Model操作表的实现

    Django中的Model操作表的实现

    这篇文章主要介绍了Django中的Model操作表的实现,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-07-07
  • Python wxPython库Core组件BoxSizer用法示例

    Python wxPython库Core组件BoxSizer用法示例

    这篇文章主要介绍了Python wxPython库Core组件BoxSizer用法,结合实例形式分析了wxPython BoxSizer布局管理相关使用方法及操作注意事项,需要的朋友可以参考下
    2018-09-09

最新评论