深入浅出分析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 相关文章推荐
pydev使用wxpython找不到路径的解决方法
Feb 10 Python
django实现前后台交互实例
Aug 07 Python
Python实现类似比特币的加密货币区块链的创建与交易实例
Mar 20 Python
pytorch训练imagenet分类的方法
Jul 27 Python
对Python中实现两个数的值交换的集中方法详解
Jan 11 Python
Python3.4学习笔记之常用操作符,条件分支和循环用法示例
Mar 01 Python
利用pytorch实现对CIFAR-10数据集的分类
Jan 14 Python
tensorflow实现在函数中用tf.Print输出中间值
Jan 21 Python
Python模拟FTP文件服务器的操作方法
Feb 18 Python
详解Python高阶函数
Aug 15 Python
Python深度学习之Pytorch初步使用
May 20 Python
详解python网络进程
Jun 15 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
松下Panasonic RF-B65电路分析
2021/03/02 无线电
php生成word并下载代码实例
2019/03/15 PHP
thinkphp5框架实现数据库读取的数据转换成json格式示例
2019/10/10 PHP
javascript 跳转代码集合
2009/12/03 Javascript
node.js中的buffer.Buffer.isEncoding方法使用说明
2014/12/14 Javascript
Juery解决tablesorter中文排序和字符范围的方法
2015/05/06 Javascript
javascript 常见功能汇总
2015/06/11 Javascript
jquery无限级联下拉菜单简单实例演示
2015/11/23 Javascript
JS中的hasOwnProperty()、propertyIsEnumerable()和isPrototypeOf()
2016/08/11 Javascript
AngularJS实现的JSONP跨域访问数据传输功能详解
2017/07/20 Javascript
vue解决弹出蒙层滑动穿透问题的方法
2018/09/22 Javascript
JavaScript模块管理的简单实现方式详解
2019/06/15 Javascript
layui实现数据表格点击搜索功能
2020/03/26 Javascript
[34:39]DOTA2上海特级锦标赛主赛事日 - 4 败者组第四轮#1COL VS EG第二局
2016/03/05 DOTA
[43:49]LGD vs CHAOS 2019国际邀请赛小组赛 BO2 第一场 8.15
2019/08/16 DOTA
跟老齐学Python之总结参数的传递
2014/10/10 Python
python类的方法属性与方法属性的动态绑定代码详解
2017/12/27 Python
用Python shell简化开发
2018/08/08 Python
PyCharm专业最新版2019.1安装步骤(含激活码)
2019/10/09 Python
flask利用flask-wtf验证上传的文件的方法
2020/01/17 Python
利用HTML5 Canvas制作键盘及鼠标动画的实例分享
2016/03/15 HTML / CSS
canvas绘制太极图的实现示例
2020/04/29 HTML / CSS
Kickers鞋英国官网:男士、女士和儿童鞋
2021/03/08 全球购物
实习自我鉴定模板
2013/09/28 职场文书
超市创业计划书
2014/04/24 职场文书
三字经教学反思
2014/04/26 职场文书
2015年元旦主持词结束语
2014/12/14 职场文书
2015年外联部工作总结
2015/04/03 职场文书
公司表扬信格式
2015/05/04 职场文书
2015年乡镇纪委工作总结
2015/05/26 职场文书
小学庆六一主持词
2015/06/30 职场文书
小学六年级班主任工作经验交流材料
2015/11/02 职场文书
css实现两栏布局,左侧固定宽,右侧自适应的多种方法
2021/08/07 HTML / CSS
使用Redis实现点赞取消点赞的详细代码
2022/03/20 Redis
Java处理延时任务的常用几种解决方案
2022/06/01 Java/Android
使用Django框架创建项目
2022/06/10 Python