Python装饰器实战:从普通函数到类方法的参数化应用
本文深入解析Python装饰器的核心用法,涵盖对普通函数的时间统计、类中无参方法的装饰以及带参装饰器的实现。通过具体代码示例,展示如何利用装饰器实现类似Spring AOP的功能,包括执行前后处理、日志记录及权限拦截,帮助开发者掌握高阶Python编程技巧。
Python装饰器概述
本文详细解析Python中装饰器的常见应用场景,旨在为读者提供实用的参考案例。
Python装饰器可用于实现类似Spring AOP的功能,例如在方法执行前后执行特定逻辑、记录日志或统计运行时间,甚至可用于权限拦截。以下将从三个维度阐述Python装饰模式的具体用法:
1. 对普通函数的装饰
2. 对类中方法的装饰(无需参数)
3. 对类中方法的装饰(需传递参数)
普通函数装饰:执行时间统计
一、普通函数的装饰示例:以计算函数执行时间为例。
#coding:utf-8
import time
def timeit(func):
def wrapper(*args, **kv):
start = time.clock()
print '开始执行'
func(*args, **kv)
end =time.clock()
print '花费时间:', end - start
return wrapper
@timeit
def foo():
print 'in foo()'
if __name__=='__main__':
foo()
运行结果如下:
开始执行 in foo() 花费时间: 6.55415628267e-05
由此可见,通过装饰器可以便捷地计算时间差,而无需在普通函数内部手动编写计时逻辑。
类方法装饰:无参场景
二、类中方法的装饰(无需参数场景)
#coding:utf-8
import time
def timeit(func):
def wrapper(*args, **kv):
start = time.clock()
print '开始执行'
func(*args, **kv)
end =time.clock()
print '花费时间:', end - start
return wrapper
class MySpendTime(object):
def __init__(self):
pass
@timeit
def foo(self):
print 'in foo()'
spendtime=MySpendTime()
spendtime.foo()
运行结果如下:
开始执行 in foo() 花费时间: 4.42208134735e-05
类方法装饰:带参场景
三、类中方法的装饰(需传递参数场景)
#coding:utf-8
'''
Created on 2012-11-1
@author: yihaomen.com
'''
def UpdateUI(msg, step):
print u"内容:", msg
print u"步骤:到第%s步了" % step
def dec(func):
def wapper(self, *args, **kwargs):
func(self,*args, **kwargs)
return wapper
return dec
class Command(object):
def Excute(self):
self.Work1st()
self.Work2nd()
self.Work3rd()
@UpdateUI("开始第一步","1")
def Work1st(self):
print "Work1st"
@UpdateUI("开始第二步", 2)
def Work2nd(self):
print "Work2nd"
@UpdateUI("开始第三步", 3)
def Work3rd(self):
print "Work3rd"
if __name__=="__main__":
command = Command()
command.Excute()
运行结果如下:
内容: 开始第一步 步骤:到第1步了 内容: 开始第二步 步骤:到第2步了 内容: 开始第三步 步骤:到第3步了 Work1st Work2nd Work3rd
如需了解更多Python相关知识,可参考本站专题:《Python数据结构与算法教程》、《Python Socket编程技巧总结》、《Python函数使用技巧总结》、《Python字符串操作技巧汇总》及《Python入门与进阶经典教程》。
希望本文的内容能对您的Python程序设计工作有所帮助。
本站声明
本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。













