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


Posted in Python onJuly 28, 2017

本文实例讲述了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 相关文章推荐
Python中实现两个字典(dict)合并的方法
Sep 23 Python
介绍Python中内置的itertools模块
Apr 29 Python
Python使用面向对象方式创建线程实现12306售票系统
Dec 24 Python
Python的Flask框架中集成CKeditor富文本编辑器的教程
Jun 13 Python
详解Python nose单元测试框架的安装与使用
Dec 20 Python
详解python OpenCV学习笔记之直方图均衡化
Feb 08 Python
python清除字符串中间空格的实例讲解
May 11 Python
Python中字符串String的基本内置函数与过滤字符模块函数的基本用法
May 27 Python
python 字段拆分详解
Dec 17 Python
Python图像阈值化处理及算法比对实例解析
Jun 19 Python
简单了解如何封装自己的Python包
Jul 08 Python
python中super()函数的理解与基本使用
Aug 30 Python
分享一个可以生成各种进制格式IP的小工具实例代码
Jul 28 #Python
Python使用sorted排序的方法小结
Jul 28 #Python
python发送邮件实例分享
Jul 28 #Python
Python分治法定义与应用实例详解
Jul 28 #Python
Python更新数据库脚本两种方法及对比介绍
Jul 27 #Python
Python判断文件或文件夹是否存在的三种方法
Jul 27 #Python
Python开发SQLite3数据库相关操作详解【连接,查询,插入,更新,删除,关闭等】
Jul 27 #Python
You might like
yii框架配置默认controller和action示例
2014/04/30 PHP
PHP带节点操作的无限分类实现方法详解
2016/11/09 PHP
js 匿名调用实现代码
2009/06/19 Javascript
Mootools 1.2 手风琴(Accordion)教程
2009/09/15 Javascript
对 lightbox JS 图片控件进行了一下改造, 使其他支持复杂的图片说明
2010/03/20 Javascript
js实现进度条的方法
2015/02/13 Javascript
异步安全加载javascript文件的方法
2015/07/21 Javascript
js判断某个字符出现的次数的简单实例
2016/06/03 Javascript
微信小程序加载更多 点击查看更多
2016/11/29 Javascript
微信小程序 出现47001 data format error原因解决办法
2017/03/10 Javascript
关于vue.extend和vue.component的区别浅析
2017/08/16 Javascript
微信小程序录音与播放录音功能
2017/12/25 Javascript
react中fetch之cors跨域请求的实现方法
2018/03/14 Javascript
angularJs利用$scope处理升降序的方法
2018/10/08 Javascript
JavaScript之解构赋值的理解
2019/01/30 Javascript
12个提高JavaScript技能的概念(小结)
2019/05/09 Javascript
JavaScript实现HSL拾色器
2020/05/21 Javascript
JSON 入门教程基础篇 json入门学习笔记
2020/09/22 Javascript
vue 全局封装loading加载教程(全局监听)
2020/11/05 Javascript
[02:32]“虐狗”镜头慎点 2016国际邀请赛中国区预选赛现场玩家采访
2016/06/28 DOTA
使用python调用浏览器并打开一个网址的例子
2014/06/05 Python
python处理文本文件实现生成指定格式文件的方法
2014/07/31 Python
初步讲解Python中的元组概念
2015/05/21 Python
python中字典(Dictionary)用法实例详解
2015/05/30 Python
python 按照固定长度分割字符串的方法小结
2018/04/30 Python
Python切割图片成九宫格的示例代码
2020/03/10 Python
基于 HTML5 的 WebGL 3D 版俄罗斯方块的示例代码
2018/05/28 HTML / CSS
html5 利用重力感应实现摇一摇换颜色可用来做抽奖等等
2014/05/07 HTML / CSS
英国天然保健品网站:Simply Supplements
2017/03/22 全球购物
Hertz荷兰:荷兰和全球租车
2018/01/07 全球购物
KOHLER科勒美国官网:国际著名卫浴橱柜领先品牌
2020/06/27 全球购物
室内设计专业个人的自我评价
2013/10/19 职场文书
篝火晚会策划方案
2014/05/16 职场文书
预防传染病方案
2014/06/14 职场文书
2015年试用期自我评价范文
2015/03/10 职场文书
入党介绍人意见怎么写
2015/06/03 职场文书