深入浅出分析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 MySQLdb Windows下安装教程及问题解决方法
May 09 Python
Python排序搜索基本算法之选择排序实例分析
Dec 09 Python
python实现简单神经网络算法
Mar 10 Python
Python中一行和多行import模块问题
Apr 01 Python
[原创]Python入门教程3. 列表基本操作【定义、运算、常用函数】
Oct 30 Python
python/sympy求解矩阵方程的方法
Nov 08 Python
python使用tkinter库实现五子棋游戏
Jun 18 Python
命令行运行Python脚本时传入参数的三种方式详解
Oct 11 Python
在flask中使用python-dotenv+flask-cli自定义命令(推荐)
Jan 05 Python
pycharm工具连接mysql数据库失败问题
Apr 01 Python
终于搞懂了Keras中multiloss的对应关系介绍
Jun 22 Python
Python 使用office365邮箱的示例
Oct 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
用mysql内存表来代替php session的类
2009/02/01 PHP
php中设置多级目录session的问题
2011/08/08 PHP
mac下安装nginx和php
2013/11/04 PHP
PHP三元运算的2种写法代码实例
2014/05/12 PHP
php如何实现只替换一次或N次
2015/10/29 PHP
PHP 二维数组和三维数组的过滤
2016/03/16 PHP
php curl中gzip的压缩性能测试实例分析
2016/11/08 PHP
详解php中serialize()和unserialize()函数
2017/07/08 PHP
javascript showModalDialog 内跳转页面的问题
2010/11/25 Javascript
Javascript中Event属性搜集整理
2013/09/17 Javascript
js 剪切板应用clipboardData详细解析
2013/12/17 Javascript
jquery自定义函数的多种方法
2014/01/09 Javascript
ListBox实现上移,下移,左移,右移的简单实例
2014/02/13 Javascript
js鼠标点击图片切换效果实现代码
2015/11/19 Javascript
微信小程序购物商城系统开发系列-工具篇的介绍
2016/11/21 Javascript
使用 NodeJS+Express 开发服务端的简单介绍
2017/04/07 NodeJs
学习使用Bootstrap输入框、导航、分页等常用组件
2017/05/11 Javascript
react-redux中connect()方法详细解析
2017/05/27 Javascript
Easyui和zTree两种方式分别实现树形下拉框
2017/08/04 Javascript
利用yarn代替npm管理前端项目模块依赖的方法详解
2017/09/04 Javascript
2种简单的js倒计时方式
2017/10/20 Javascript
使用Vue如何写一个双向数据绑定(面试常见)
2018/04/20 Javascript
node.JS的crypto加密模块使用方法详解(MD5,AES,Hmac,Diffie-Hellman加密)
2020/02/06 Javascript
简单易懂的python环境安装教程
2017/07/13 Python
python 发送json数据操作实例分析
2019/10/15 Python
Python+Dlib+Opencv实现人脸采集并表情判别功能的代码
2020/07/01 Python
骨干教师培训感言
2014/01/16 职场文书
自荐信写法介绍
2014/01/25 职场文书
市场安全管理制度
2014/01/26 职场文书
读书活动实施方案
2014/03/10 职场文书
《锄禾》教学反思
2014/04/08 职场文书
汽车广告策划方案
2014/05/31 职场文书
2014年卫生保健工作总结
2014/12/08 职场文书
精神文明建设汇报材料
2014/12/24 职场文书
思想品德评语大全
2014/12/31 职场文书
2015年护士节活动策划方案
2015/05/04 职场文书