深入浅出分析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通过正则查找微博@(at)用户的方法
Mar 13 Python
python 查找字符串是否存在实例详解
Jan 20 Python
Python实现学生成绩管理系统
Apr 05 Python
python去除扩展名的实例讲解
Apr 23 Python
Python中常用的8种字符串操作方法
May 06 Python
django获取from表单multiple-select的value和id的方法
Jul 19 Python
Python实现微信翻译机器人的方法
Aug 13 Python
如何基于python测量代码运行时间
Dec 25 Python
Python使用Tkinter实现滚动抽奖器效果
Jan 06 Python
在tensorflow中实现屏蔽输出的log信息
Feb 04 Python
详解分布式系统中如何用python实现Paxos
May 18 Python
让文件路径提取变得更简单的Python Path库
May 27 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
php SQL之where语句生成器
2009/03/24 PHP
几行代码轻松实现PHP文件打包下载zip
2017/03/01 PHP
PHP静态延迟绑定和普通静态效率的对比
2017/10/20 PHP
JavaScript 操作键盘的Enter事件(键盘任何事件),兼容多浏览器
2010/10/11 Javascript
Jquery+CSS3实现一款简洁大气带滑动效果的弹出层
2013/05/15 Javascript
Extjs4实现两个GridPanel之间数据拖拽功能具体方法
2013/11/21 Javascript
jquery.post用法之type设置问题
2014/02/24 Javascript
node.js中的fs.fchmod方法使用说明
2014/12/16 Javascript
JS阻止事件冒泡行为和闭包的方法
2016/06/16 Javascript
js使用highlight.js高亮你的代码
2017/08/18 Javascript
javascript用rem来做响应式开发
2018/01/13 Javascript
JS实现简单的星期格式转换功能示例
2018/07/23 Javascript
详解微信小程序实现仿微信聊天界面(各种细节处理)
2019/02/17 Javascript
vue里的data要用return返回的原因浅析
2019/05/28 Javascript
layui问题之自动滚动二级iframe页面到指定位置的方法
2019/09/18 Javascript
利用layer实现表单完美验证的方法
2019/09/26 Javascript
javascript中innerHTML 获取或替换html内容的实现代码
2020/03/17 Javascript
js事件机制----捕获与冒泡机制实例分析
2020/05/22 Javascript
vue项目打包后提交到git上为什么没有dist这个文件的解决方法
2020/09/16 Javascript
Django在Win7下的安装及创建项目hello word简明教程
2014/07/14 Python
符合语言习惯的 Python 优雅编程技巧【推荐】
2018/09/25 Python
使用pyecharts生成Echarts网页的实例
2019/08/12 Python
python聚类算法解决方案(rest接口/mpp数据库/json数据/下载图片及数据)
2019/08/28 Python
BONIA波尼亚新加坡官网:皮革手袋,鞋类和配件
2016/08/25 全球购物
优衣库英国官网:UNIQLO英国
2016/12/25 全球购物
财务人员个人求职信范文
2013/12/04 职场文书
计算机专业职业规划
2014/02/28 职场文书
安全教育实施方案
2014/03/02 职场文书
船舶工程技术专业求职信
2014/08/07 职场文书
2014年双拥工作总结
2014/11/21 职场文书
接待员岗位职责
2015/02/13 职场文书
2015年计划生育责任书
2015/05/08 职场文书
团队拓展训练心得体会
2016/01/12 职场文书
2016中秋节月饼促销广告语
2016/01/28 职场文书
在CSS中映射鼠标位置并实现通过鼠标移动控制页面元素效果(实例代码)
2021/04/22 HTML / CSS
如何用PHP websocket实现网页实时聊天
2021/05/26 PHP