深入浅出分析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 切片和range()用法说明
Mar 24 Python
基于Python的身份证号码自动生成程序
Aug 15 Python
Python实现的数据结构与算法之链表详解
Apr 22 Python
Python在groupby分组后提取指定位置记录方法
Apr 20 Python
Python基于OpenCV库Adaboost实现人脸识别功能详解
Aug 25 Python
python使用PIL模块获取图片像素点的方法
Jan 08 Python
详解python编译器和解释器的区别
Jun 24 Python
一文秒懂python读写csv xml json文件各种骚操作
Jul 04 Python
Python笔试面试题小结
Sep 07 Python
python生成13位或16位时间戳以及反向解析时间戳的实例
Mar 03 Python
python实现简单的tcp 文件下载
Sep 16 Python
python中numpy.empty()函数实例讲解
Feb 05 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中几种常见的超时处理全面总结
2012/09/11 PHP
php实现批量下载百度云盘文件例子分享
2014/04/10 PHP
php查询mysql数据库并将结果保存到数组的方法
2015/03/18 PHP
php验证身份证号码正确性的函数
2016/07/20 PHP
动态表单验证的操作方法和TP框架里面的ajax表单验证
2017/07/19 PHP
jQuery 菜单随滚条改为以定位方式(固定要浏览器顶部)
2012/05/24 Javascript
jQuery操作CheckBox的方法介绍(选中,取消,取值)
2014/02/04 Javascript
jQuery UI库中dialog对话框功能使用全解析
2016/04/23 Javascript
layer实现弹窗提交信息
2016/12/12 Javascript
微信小程序 textarea 组件详解及简单实例
2017/01/10 Javascript
微信小程序中form 表单提交和取值实例详解
2017/04/20 Javascript
javascript 中模板方法单例的实现方法
2017/10/17 Javascript
jQuery超简单遮罩层实现方法示例
2018/09/06 jQuery
基于vue-upload-component封装一个图片上传组件的示例
2018/10/16 Javascript
vue-resourc发起异步请求的方法
2020/02/11 Javascript
JavaScript实现字符串与HTML格式相互转换
2020/03/17 Javascript
[39:08]完美世界DOTA2联赛PWL S3 LBZS vs CPG 第一场 12.12
2020/12/16 DOTA
python基于ID3思想的决策树
2018/01/03 Python
Python unittest单元测试框架总结
2018/09/08 Python
uwsgi+nginx部署Django项目操作示例
2018/12/04 Python
Django框架orM与自定义SQL语句混合事务控制操作
2019/06/27 Python
关于TensorFlow新旧版本函数接口变化详解
2020/02/10 Python
使用Python和百度语音识别生成视频字幕的实现
2020/04/09 Python
Python定时从Mysql提取数据存入Redis的实现
2020/05/03 Python
解决TensorFlow程序无限制占用GPU的方法
2020/06/30 Python
5款实用的python 工具推荐
2020/10/13 Python
matplotlib运行时配置(Runtime Configuration,rc)参数rcParams解析
2021/01/05 Python
One.com挪威:北欧成长最快的网络托管公司
2016/11/19 全球购物
Ralph Lauren英国官方网站:Ralph Lauren UK
2018/04/03 全球购物
工程预算与管理应届生求职信
2013/10/06 职场文书
护士自荐信范文
2013/12/15 职场文书
主管竞聘书范文
2014/03/31 职场文书
一份没有按时交货失信于客户的检讨书
2014/09/19 职场文书
幼师自荐信范文
2015/03/06 职场文书
运动会开幕式通讯稿
2015/07/18 职场文书
乡镇干部学习心得体会
2016/01/23 职场文书