python中装饰器的简单理解
程序员文章站
2024-02-12 12:44:07
...
装饰器
装饰器也属于闭包的一种
#装饰器是一个很著名的设计模式,经常被用于有切面需求的场景,较为经典的有插入日志、性能测试、事务处理等。装饰器是解决这类问题的绝佳设计,有了装饰器,我们就可以抽离出大量函数中与函数功能本身无关的雷同代码并继续重用。概括的讲,装饰器的作用就是为已经存在的对象添加额外的功能。
import time
def decore(func): #decore为修饰名,可以随意指定,但需要遵循变量命名原则。
#且func同理,但func传入的是@修饰符以下的第一个函数。
#定义了一个计时器函数,传入一个要计时的函数,并返回另一个附加了计时功能的方法
def say(): #定义内部函数,此功能为计算程序运行时间
#定义一个内嵌的包装函数,给传入的函数加上计时功能的包装
a = time.time()
func() #在此调用函数
b = time.time()
total_time = b - a
print(total_time)
return say #在外部函数返回内部函数的值,形成闭包
#将包装后的函数返回
@decore
def hanshu(): #需要修饰的函数,自我理解修饰器就是用作测量或者其他功能的工具。
a = [i for i in range(1,301)]
b1 = a[0]
b2 = a[0]
for i in range(len(a)):
if a[i] > b1:
b1 = a[i]
for i in range(len(a)):
if a[i] < b2:
b2 = a[i]
print("最大值为%d,最小值为%d"%(b1,b2))
hanshu()
python中可以在函数里面定义另一个函数,也就是说函数可以赋给其他变量,也可以返回一个函数。
装饰器能够让你在装饰前后执行代码而无须改变函数本身内容。
转载
手动装饰器
# 装饰器是一个函数,而其参数为另外一个函数
def my_shiny_new_decorator(a_function_to_decorate) :
# 在内部定义了另外一个函数:一个封装器。
# 这个函数将原始函数进行封装,所以你可以在它之前或者之后执行一些代码
def the_wrapper_around_the_original_function() :
# 放一些你希望在真正函数执行前的一些代码
print "Before the function runs"
# 执行原始函数
a_function_to_decorate()
# 放一些你希望在原始函数执行后的一些代码
print "After the function runs"
#在此刻,"a_function_to_decrorate"还没有被执行,我们返回了创建的封装函数
#封装器包含了函数以及其前后执行的代码,其已经准备完毕
return the_wrapper_around_the_original_function
# 现在想象下,你创建了一个你永远也不远再次接触的函数
def a_stand_alone_function() :
print "I am a stand alone function, don't you dare modify me"
a_stand_alone_function()
#输出: I am a stand alone function, don't you dare modify me
# 好了,你可以封装它实现行为的扩展。可以简单的把它丢给装饰器
# 装饰器将动态地把它和你要的代码封装起来,并且返回一个新的可用的函数。
a_stand_alone_function_decorated = my_shiny_new_decorator(a_stand_alone_function)
a_stand_alone_function_decorated()
#输出 :
#Before the function runs
#I am a stand alone function, don't you dare modify me
#After the function runs
现在你也许要求当每次调用a_stand_alone_function时,实际调用却是a_stand_alone_function_decorated。实现也很简单,可以用my_shiny_new_decorator来给a_stand_alone_function重新赋值。
下一篇: Jlabel实现内容自动换行简单实例