深入浅出分析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实现备份文件实例
Sep 16 Python
Android应用开发中Action bar编写的入门教程
Feb 26 Python
详解python的数字类型变量与其方法
Nov 20 Python
python学习之matplotlib绘制散点图实例
Dec 09 Python
使用 Python 实现简单的 switch/case 语句的方法
Sep 17 Python
python3 自动识别usb连接状态,即对usb重连的判断方法
Jul 03 Python
关于PyTorch源码解读之torchvision.models
Aug 17 Python
python 画出使用分类器得到的决策边界
Aug 21 Python
Django文件上传与下载(FileFlid)
Oct 06 Python
Python调用C/C++的方法解析
Aug 05 Python
用python实现前向分词最大匹配算法的示例代码
Aug 06 Python
Python测试框架:pytest学习笔记
Oct 20 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 手机归属地查询 api
2010/02/08 PHP
php imagecreatetruecolor 创建高清和透明图片代码小结
2010/05/15 PHP
Linux下php5.4启动脚本
2014/08/03 PHP
php集成动态口令认证
2016/07/21 PHP
聊聊 PHP 8 新特性 Attributes
2020/08/19 PHP
基于jquery的表格排序
2010/09/11 Javascript
JavaScript中__proto__与prototype的关系深入理解
2012/12/04 Javascript
JS如何将数字类型转化为没3个一个逗号的金钱格式
2014/01/27 Javascript
实现图片预加载的三大方法及优缺点分析
2014/11/19 Javascript
jQuery绑定事件的几种实现方式
2016/05/09 Javascript
JavaScript定义数组的三种方法(new Array(),new Array('x','y')
2016/10/04 Javascript
Django+Vue.js搭建前后端分离项目的示例
2017/08/07 Javascript
vue编译打包本地查看index文件的方法
2018/02/23 Javascript
jquery动态添加带有样式的HTML标签元素方法
2018/02/24 jQuery
JavaScript解决浮点数计算不准确问题的方法分析
2018/07/09 Javascript
解决Layui数据表格中checkbox位置不居中的方法
2018/08/15 Javascript
vue组件数据传递、父子组件数据获取,slot,router路由功能示例
2019/03/19 Javascript
基于JQuery实现页面定时弹出广告
2020/05/08 jQuery
梳理一下vue中的生命周期
2020/12/30 Vue.js
浅谈Python中的可变对象和不可变对象
2017/07/07 Python
python实现两张图片的像素融合
2019/02/23 Python
pandas DataFrame 交集并集补集的实现
2019/06/24 Python
Python scrapy增量爬取实例及实现过程解析
2019/12/24 Python
Python爬虫抓取论坛关键字过程解析
2020/10/19 Python
英国品牌男装折扣网站:Brown Bag
2018/03/08 全球购物
领导的自我鉴定
2013/12/28 职场文书
电子信息工程专业自荐书
2014/06/24 职场文书
小学竞选班长演讲稿
2014/09/09 职场文书
小学假期安全广播稿
2014/09/28 职场文书
公安机关正风肃纪剖析材料
2014/10/10 职场文书
竞聘报告优秀范文
2014/11/06 职场文书
2014年学生会生活部工作总结
2014/11/07 职场文书
七一建党节慰问信
2015/02/14 职场文书
2015年教师学期工作总结
2015/04/30 职场文书
爱的教育观后感
2015/06/17 职场文书
解析:创业计划书和商业计划书二者之间到底有什么区别
2019/08/14 职场文书