深入浅出分析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 相关文章推荐
使用wxpython实现的一个简单图片浏览器实例
Jul 10 Python
Python中exit、return、sys.exit()等使用实例和区别
May 28 Python
python利用有道翻译实现&quot;语言翻译器&quot;的功能实例
Nov 14 Python
Django migrations 默认目录修改的方法教程
Sep 28 Python
Django Rest framework权限的详细用法
Jul 25 Python
python实现发送form-data数据的方法详解
Sep 27 Python
基于python操作ES实例详解
Nov 16 Python
pandas创建DataFrame的7种方法小结
Jun 14 Python
python中线程和进程有何区别
Jun 17 Python
Python selenium键盘鼠标事件实现过程详解
Jul 28 Python
Python制作数据预测集成工具(值得收藏)
Aug 21 Python
Python实现Excel自动分组合并单元格
Feb 22 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树型类实例
2014/12/05 PHP
php上传图片客户端和服务器端实现方法
2015/03/30 PHP
浅谈PHP实现大流量下抢购方案
2017/12/15 PHP
在PHP中输出JS语句以及乱码问题的解决方案
2019/02/13 PHP
Javascript 面向对象 继承
2010/05/13 Javascript
JS中的prototype与面向对象的实例讲解
2013/05/22 Javascript
js的匿名函数使用介绍
2013/12/11 Javascript
js显示文本框提示文字的方法
2015/05/07 Javascript
JavaScript 继承详解(六)
2016/10/11 Javascript
jQuery插件FusionCharts绘制的2D双柱状图效果示例【附demo源码】
2017/05/13 jQuery
微信小程序实现缓存根据不同的id来进行设置和读取缓存
2017/06/12 Javascript
基于Two.js实现星球环绕动画效果的示例
2017/11/06 Javascript
完美解决mui框架off-canvas侧滑超出部分隐藏无法滚动的问题
2018/01/25 Javascript
浅谈如何使用webpack构建多页面应用
2018/05/30 Javascript
详解基于DllPlugin和DllReferencePlugin的webpack构建优化
2018/06/28 Javascript
Layui 设置select下拉框自动选中某项的方法
2018/08/14 Javascript
单线程JavaScript实现异步过程详解
2020/05/19 Javascript
nuxt引入组件和公共样式的操作
2020/11/05 Javascript
[02:42]决战东方!DOTA2亚洲邀请赛重启荣耀之争
2017/03/17 DOTA
python简单的三元一次方程求解实例
2020/04/02 Python
keras 简单 lstm实例(基于one-hot编码)
2020/07/02 Python
django有哪些好处和优点
2020/09/01 Python
python爬虫泛滥的解决方法详解
2020/11/25 Python
使用简单的CSS3属性实现炫酷读者墙效果
2014/01/08 HTML / CSS
HTML5 Canvas渐进填充与透明实现图像的Mask效果
2013/07/11 HTML / CSS
新学期校长寄语
2014/01/18 职场文书
关于廉洁的广播稿
2014/01/30 职场文书
服务口号大全
2014/06/11 职场文书
应用心理学专业求职信
2014/08/04 职场文书
2014年项目工作总结
2014/11/24 职场文书
放射科岗位职责
2015/02/14 职场文书
民间借贷被告代理词
2015/05/23 职场文书
2016年社区六一儿童节活动总结
2016/04/06 职场文书
Matlab如何实现矩阵复制扩充
2021/06/02 Python
Redis监控工具RedisInsight安装与使用
2022/03/21 Redis
Win11怎么添加用户?Win11添加用户账户的方法
2022/07/15 数码科技