深入浅出分析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通过解析网页实现看报程序的方法
Aug 04 Python
Python中尝试多线程编程的一个简明例子
Apr 07 Python
Python中time模块与datetime模块在使用中的不同之处
Nov 24 Python
Django Admin实现上传图片校验功能
Mar 06 Python
Django的HttpRequest和HttpResponse对象详解
Jan 26 Python
Python Django Vue 项目创建过程详解
Jul 29 Python
Django用户身份验证完成示例代码
Apr 03 Python
Tensorflow实现将标签变为one-hot形式
May 22 Python
Matlab中plot基本用法的具体使用
Jul 17 Python
python 数据类型强制转换的总结
Jan 25 Python
Python基于Tkinter开发一个爬取B站直播弹幕的工具
May 06 Python
Python标准库之typing的用法(类型标注)
Jun 02 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 和 MySQL 开发的 8 个技巧
2006/10/09 PHP
COM in PHP (winows only)
2006/10/09 PHP
php+highchats生成动态统计图
2014/05/21 PHP
smarty简单应用实例
2015/11/03 PHP
PHP 7.1中AES加解密方法mcrypt_module_open()的替换方案
2017/10/17 PHP
PHP写API输出的时用echo的原因详解
2019/04/28 PHP
javascript使用定时函数实现跳转到某个页面
2013/12/25 Javascript
jQuery取得设置清空select选择的文本与值
2014/07/08 Javascript
javascript 原型链维护和继承详解
2014/11/26 Javascript
JS+CSS实现类似QQ好友及黑名单效果的树型菜单
2015/09/22 Javascript
js验证真实姓名与身份证号是否匹配
2015/10/13 Javascript
JavaScript焦点事件、鼠标事件和滚轮事件使用详解
2016/01/15 Javascript
字符串反转_JavaScript
2016/04/28 Javascript
使用JQuery 加载页面时调用JS的实现方法
2016/05/30 Javascript
jQuery实现可兼容IE6的淡入淡出效果告警提示功能示例
2017/09/20 jQuery
(模仿京东用户注册)用JQuery实现简单表单验证,初学者必看
2018/01/08 jQuery
webpack之devtool详解
2018/02/10 Javascript
JS简单获取并修改input文本框内容的方法示例
2018/04/08 Javascript
node前端开发模板引擎Jade的入门
2018/05/11 Javascript
vue中各种通信传值方式总结
2019/02/14 Javascript
微信小程序防止多次点击跳转和防止表单组件输入内容多次验证功能(函数防抖)
2019/09/19 Javascript
详解利用nodejs对本地json文件进行增删改查
2019/09/20 NodeJs
mpvue 项目初始化及实现授权登录的实现方法
2020/07/20 Javascript
Vue项目开发常见问题和解决方案总结
2020/09/11 Javascript
vue router-link 默认a标签去除下划线的实现
2020/11/06 Javascript
在Django框架中运行Python应用全攻略
2015/07/17 Python
关于python pyqt5安装失败问题的解决方法
2017/08/08 Python
tensorflow学习笔记之简单的神经网络训练和测试
2018/04/15 Python
Python之pandas读写文件乱码的解决方法
2018/04/20 Python
浅谈python3中input输入的使用
2019/08/02 Python
Python devel安装失败问题解决方案
2020/06/09 Python
PatPat香港:婴童服饰和亲子全家装在线购物
2020/09/27 全球购物
优秀的2014年两会精神解读
2014/03/17 职场文书
师德自我剖析材料范文
2014/10/06 职场文书
怎样写观后感
2015/06/19 职场文书
会计入职心得体会
2016/01/22 职场文书