python 装饰器

 

 

复制代码
#######################################################################################################
#传统写法 ,主要功能和辅助功能写在一个函数内
####################################################################################################### import time def print_odds(): print("开始时间:",time.clock()) for i in range(100): if i%2 ==1: print(i) print("结束时间:",time.clock()) if __name__ == '__main__': print_odds() #######################################################################################################
#主要功能函数,辅助功能函数分离开的写法
#######################################################################################################
import time def count_time(func): #统计一个函数执行时间 start_time = time.clock() func() end_time = time.clock() print("总共用时:{}秒".format(end_time - start_time)) def print_odds(): #输出1-100之间的所有奇数 for i in range(100): if i%2==1: print(i) if __name__ == '__main__': count_time(print_odds) #######################################################################################################
#闭包函数写法 ,闭包函数: 一个函数,其参数和返回值都是函数

####################################################################################################### import time def print_odds(): #输出1-100之间的所有奇数 for i in range(100): if i%2==1: print(i) def count_time_wrapper(func): def improved_func(): start_time = time.clock() func() end_time = time.clock() print("总共用时:{}秒".format(end_time - start_time)) return improved_func if __name__ == '__main__': pp = count_time_wrapper(print_odds) #返回值是一个函数,pp 此时就是个函数 pp () #pp() 代表调用pp函数 #######################################################################################################

#装饰器写法

####################################################################################################### import time def count_time_wrapper(func): def improved_func(): start_time = time.clock() func() end_time = time.clock() print("总共用时:{}秒".format(end_time - start_time)) return improved_func @count_time_wrapper def print_odds(): #输出1-100之间的所有奇数 for i in range(100): if i%2==1: print(i) if __name__ == '__main__': print_odds() ####################################################################################################### #带参数装饰器 ####################################################################################################### import time def count_time_wrapper(func): def improved_func(*args,**kwargs): start_time = time.clock() ret = func(*args,**kwargs) end_time = time.clock() print("总共用时:{}秒".format(end_time - start_time)) return ret return improved_func def print_odds(lim=100): #输出1-100之间的所有奇数 cnt = 0 for i in range(lim): if i%2==1: #print(i) cnt = cnt +1 return cnt if __name__ == '__main__': print("增强前") print(print_odds()) #print(print_odds(lim=60)) print("-" * 100) print("增强后") ll = count_time_wrapper(print_odds) #ll() print(ll(lim=60)) print("-" * 100) ####################################################################################################### # 通用的闭包函数 ####################################################################################################### def general_wrapper(func): def improveed_func(*args,**kwargs): #接收函数参数 ret = func(*args,**kwargs) #传入参数并接收返回值 return ret return improveed_func
复制代码

 

复制代码
# #######################################################################################################
#
# #多个装饰器
#
# #######################################################################################################

def wrapper1(func1):
    print("第一个闭包")
    def improved_func1(func):
        print("在第一个闭包内调用函数")
    return improved_func1

def wrapper2(func2):
    print("第二个闭包")
    def improved_func2():
        print("在第二个闭包内调用函数")
    return improved_func2

@wrapper1
@wrapper2
def  oringinal_func():
    print("主功能函数")

if __name__ == '__main__':
    print("!" * 150)
    oringinal_func = wrapper2(oringinal_func)
    print(oringinal_func.__name__)
    print ("!" * 150)
    oringinal_func = wrapper1(oringinal_func)
    print(oringinal_func.__name__)
复制代码

 

 

 

 

 

 

 

posted @   chengxuyonghu  阅读(18)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?
历史上的今天:
2020-10-12 DB2高可用性
点击右上角即可分享
微信分享提示