深入浅出分析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中的并发编程实例
Jul 07 Python
python使用7z解压apk包的方法
Apr 18 Python
在Django中编写模版节点及注册标签的方法
Jul 20 Python
浅谈python 里面的单下划线与双下划线的区别
Dec 01 Python
Python实现的简单读写csv文件操作示例
Jul 12 Python
用python爬取租房网站信息的代码
Dec 14 Python
django解决跨域请求的问题详解
Jan 20 Python
pandas 强制类型转换 df.astype实例
Apr 09 Python
利用python对excel中一列的时间数据更改格式操作
Jul 14 Python
Python urllib3软件包的使用说明
Nov 18 Python
VSCODE配置Markdown及Markdown基础语法详解
Jan 19 Python
Pygame Draw绘图函数的具体使用
Nov 17 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数组最大值,最小值的代码
2011/10/31 PHP
linux下安装php的memcached客户端
2014/08/03 PHP
php性能分析之php-fpm慢执行日志slow log用法浅析
2016/10/17 PHP
使用Microsoft Ajax Minifier减小JavaScript文件大小的方法
2010/04/01 Javascript
JS遮罩层效果 兼容ie firefox jQuery遮罩层
2010/07/26 Javascript
解析window.open的使用方法总结
2013/06/19 Javascript
JavaScript伸缩的菜单简单示例
2013/12/03 Javascript
jquery获取元素索引值index()示例
2014/02/13 Javascript
深入分析jquery解析json数据
2014/12/09 Javascript
JQuery中Text方法用法实例分析
2015/05/18 Javascript
jquery判断至少有一个checkbox被选中的方法
2015/06/05 Javascript
JSONObject使用方法详解
2015/12/17 Javascript
Bootstrap3学习笔记(三)之表格
2016/05/20 Javascript
第二篇Bootstrap起步
2016/06/21 Javascript
利用JS判断字符串是否含有数字与特殊字符的方法小结
2016/11/25 Javascript
jQuery无缝轮播图代码
2016/12/22 Javascript
webpack v4 从dev到prd的方法
2018/04/02 Javascript
JS实现统计字符串中字符出现个数及最大个数功能示例
2018/06/04 Javascript
基于elementUI使用v-model实现经纬度输入的vue组件
2019/05/12 Javascript
微信小程序左滑删除实现代码实例
2019/09/16 Javascript
js+canvas实现图片格式webp/png/jpeg在线转换
2020/08/22 Javascript
vue 在服务器端直接修改请求的接口地址
2020/12/19 Vue.js
[05:05]给小松五分钟系列 第二期介绍为什么打DOTA2
2014/07/02 DOTA
[01:01]青春无憾,一战成名——DOTA2全国高校联赛开启
2018/02/25 DOTA
python解析中国天气网的天气数据
2014/03/21 Python
Python基于pygame实现的font游戏字体(附源码)
2015/11/11 Python
Python Numpy 数组的初始化和基本操作
2018/03/13 Python
python自动发送测试报告邮件功能的实现
2019/01/22 Python
代码详解django中数据库设置
2019/01/28 Python
python中not、and和or的优先级与详细用法介绍
2020/11/03 Python
html5中valid、invalid、required的定义
2014/02/21 HTML / CSS
美国最大的船只买卖在线市场:Boat Trader
2018/08/04 全球购物
英国男女豪华配饰和礼品网站:Black.co.uk
2020/02/28 全球购物
雷朋巴西官方商店:Ray-Ban Brasil
2020/07/21 全球购物
海量信息软件测试笔试题
2015/08/08 面试题
导游词之鲁迅祖居
2019/10/17 职场文书