深入浅出分析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中使用items()方法返回字典元素对的教程
May 21 Python
python遍历目录的方法小结
Apr 28 Python
python pandas获取csv指定行 列的操作方法
Jul 12 Python
Python openpyxl读取单元格字体颜色过程解析
Sep 03 Python
在vscode中配置python环境过程解析
Sep 28 Python
python集合的创建、添加及删除操作示例
Oct 08 Python
django 扩展user用户字段inlines方式
Mar 30 Python
python实现简单学生信息管理系统
Apr 09 Python
jupyter note 实现将数据保存为word
Apr 14 Python
Python中的Cookie模块如何使用
Jun 04 Python
Python如何操作docker redis过程解析
Aug 10 Python
详解基于Scrapy的IP代理池搭建
Sep 29 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下目前为目最全的CURL中文说明
2010/08/01 PHP
6种php上传图片重命名的方法实例
2013/11/04 PHP
php实现统计二进制中1的个数算法示例
2018/01/23 PHP
PHP连接sftp并下载文件的方法教程
2018/08/26 PHP
JavaScript 处理Iframe自适应高度(同或不同域名下)
2013/03/29 Javascript
jQuery实现鼠标可拖动调整表格列宽度
2014/05/26 Javascript
Node.js中安全调用系统命令的方法(避免注入安全漏洞)
2014/12/05 Javascript
基于socket.io+express实现多房间聊天
2016/03/17 Javascript
前端js文件合并的三种方式推荐
2016/05/19 Javascript
JS取模、取商及取整运算方法示例
2016/10/13 Javascript
js实现手机发送验证码功能
2017/03/13 Javascript
Vue中父组件向子组件通信的方法
2017/07/11 Javascript
jquery实现左右轮播图效果
2017/09/28 jQuery
完美解决axios跨域请求出错的问题
2018/02/05 Javascript
jQuery+ajax读取json数据并按照价格排序示例
2018/03/28 jQuery
JS实现li标签的删除
2019/04/12 Javascript
JS开发 富文本编辑器TinyMCE详解
2019/07/19 Javascript
[47:42]Fnatic vs Liquid 2018国际邀请赛小组赛BO2 第一场 8.16
2018/08/17 DOTA
[40:05]LGD vs Winstrike 2018国际邀请赛小组赛BO2 第二场 8.17
2018/08/18 DOTA
[39:00]Optic vs VP 2018国际邀请赛淘汰赛BO3 第三场 8.24
2018/08/25 DOTA
详解python之简单主机批量管理工具
2017/01/27 Python
python基础_文件操作实现全文或单行替换的方法
2017/09/04 Python
解决django同步数据库的时候app models表没有成功创建的问题
2019/08/09 Python
一篇文章搞定Python操作文件与目录
2019/08/13 Python
python对常见数据类型的遍历解析
2019/08/27 Python
python3 mmh3安装及使用方法
2019/10/09 Python
DC Shoes官网:美国滑板鞋和服饰品牌
2017/09/03 全球购物
Amara德国:家居饰品、设计师品牌和豪华礼品
2019/05/20 全球购物
意大利运动服减价商店:ScontoSport
2020/03/10 全球购物
下列程序在32位linux或unix中的结果是什么
2015/01/26 面试题
环保建议书300字
2014/05/14 职场文书
党员作风建设整改方案
2014/10/27 职场文书
旷课检讨书
2015/01/26 职场文书
审美与表现自我评价
2015/03/09 职场文书
校车安全管理责任书
2015/05/11 职场文书
在pycharm中无法import所安装的库解决方案
2021/05/31 Python