深入浅出分析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、Javascript中的闭包比较
Feb 04 Python
Python 探针的实现原理
Apr 23 Python
virtualenv实现多个版本Python共存
Aug 21 Python
python正则表达式面试题解答
Apr 28 Python
pandas数据预处理之dataframe的groupby操作方法
Apr 13 Python
利用pyinstaller将py文件打包为exe的方法
May 14 Python
Win8下python3.5.1安装教程
Jul 29 Python
对python多线程与global变量详解
Nov 09 Python
django 实现celery动态设置周期任务执行时间
Nov 19 Python
django实现更改数据库某个字段以及字段段内数据
Mar 31 Python
python 基于UDP协议套接字通信的实现
Jan 22 Python
Python标准库pathlib操作目录和文件
Nov 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
杏林同学录(五)
2006/10/09 PHP
不重新编译PHP为php增加openssl模块的方法
2011/06/14 PHP
ThinkPHP框架设计及扩展详解
2014/11/25 PHP
IE8 引入跨站数据获取功能说明
2008/07/22 Javascript
javascript 函数速查表
2010/02/07 Javascript
jQuery EasyUI API 中文文档 可调整尺寸
2011/09/29 Javascript
js获取某月的最后一天日期的简单实例
2013/06/22 Javascript
javascript实现漂亮的拖动层,窗口拖拽特效
2015/04/24 Javascript
Bootstrap学习笔记之css样式设计(2)
2016/06/07 Javascript
js addDqmForPP给标签内属性值加上双引号的函数
2016/12/24 Javascript
如何提高数据访问速度
2016/12/26 Javascript
对vue v-if v-else-if v-else 的简单使用详解
2018/09/29 Javascript
如何使用 vue + d3 画一棵树
2018/12/03 Javascript
vue-cli构建vue项目的步骤详解
2019/01/27 Javascript
使用Vue实现移动端左滑删除效果附源码
2019/05/16 Javascript
layui动态表头的实现代码
2019/08/22 Javascript
python封装对象实现时间效果
2020/04/23 Python
python用BeautifulSoup库简单爬虫实例分析
2018/07/30 Python
Pandas之MultiIndex对象的示例详解
2019/06/25 Python
python并发编程多进程之守护进程原理解析
2019/08/20 Python
Python内置加密模块用法解析
2019/11/25 Python
python多进程重复加载的解决方式
2019/12/13 Python
Python程序控制语句用法实例分析
2020/01/14 Python
利用Python实现某OA系统的自动定位功能
2020/05/27 Python
python读取hdfs上的parquet文件方式
2020/06/06 Python
布局和排版教程 纯css3实现图片三角形排列
2014/10/17 HTML / CSS
浅谈html5标签css3的常用样式
2016/10/20 HTML / CSS
外企C语言笔试题
2013/11/10 面试题
办公室前台岗位职责
2014/01/04 职场文书
法定授权委托证明书
2014/09/27 职场文书
毕业典礼邀请函
2015/01/31 职场文书
2015年客服工作总结范文
2015/04/02 职场文书
关于Javascript闭包与应用的详解
2021/04/22 Javascript
解决pytorch 损失函数中输入输出不匹配的问题
2021/06/05 Python
MySQL 外连接语法之 OUTER JOIN
2022/04/09 MySQL
python神经网络 使用Keras构建RNN训练
2022/05/04 Python