装饰指的是为被装饰器对象添加额外功能
2、为什么要用装饰器
软件的维护应该遵循开放封闭原则开放封闭原则指的是:
软件一旦上线运行后对修改源代码是封闭的,对扩展功能的是天 干放的
这就用到了装饰器
装饰器的实现必须遵循两大原则:
1、不修改被装饰对象的源代码(人的原来的性格,生活方式)
2、不修改被装饰对象的调用方式(人的原来的外貌,名字)
# # 被修饰函数带参数 # from time import ctime,sleep # # def outer(func): # def inner(a,b): # print("%s called at %s"%(func.__name__,ctime())) # print(a,b) # print(inner.__dict__) # func(a,b) # return inner # # @outer # def foo(a,b): # print(a+b) # print("%s called at %s"%(foo.__name__,ctime())) # # # foo(1,2) # sleep(2) # foo(3,4) # # ############################################ # # # 被修饰函数带不定长参数 # from time import ctime,sleep # # def outer2(func): # def inner2(*args,**kwargs): # print("%s called at %s"%(func.__name__,ctime())) # func(*args,**kwargs) # return inner2 # # @outer2 # def foo2(a,b,c): # print(a+b+c) # # foo2(1,3,5) # sleep(2) # foo2(1,2,3) # # ############################################ # # print('#################') # # 被修饰函数带返回值 # from time import ctime,sleep # # def outer3(func): # def inner3(*args,**kwargs): # print("%s called at %s"%(func.__name__,ctime())) # ret = func(*args,**kwargs) # return ret # return inner3 # # @outer3 # def foo3(a,b,c): # return (a+b+c) # # print(foo3(1,3,5)) # # print('=====================================') # # 装饰器的实现必须遵循两大原则: # 1、不修改被装饰对象的源代码(人的原来的性格,生活方式) # 2、不修改被装饰对象的调用方式(人的原来的外貌,名字) # def run(): # print('跑步') # print('健身') # run() # def fitness(): # print('健身') # run() # def run(): # print(跑步) # fitness() # name = '111111' # def run(name): # print('=========') # print('我是%s'%name) # print('=========') # # run(name) # # def decorate(func): #func等下我们要传入的run # def new_func(name): ##run(name)的name # print('我是装饰函数代码00000') # func(name) # print('我是装饰函数代码aaaaa') # return new_func # #1.定义new_func(name)函数 2.返回new_func内存地址 3.传入run函数 # run=a=decorate(run) # # print(a) # run('666') #################################################################### # n = 9000000 # ###可以拿到当前的时间模块datetime # from datetime import datetime # # def run_time(func): ####func是for1 一个用来计算时间执行时间的装饰器 # def new_func(n): ##forl的参数n # start_time=datetime.now() # print('开始时间',start_time) # func(n) # end_time=datetime.now() # print('结束时间',end_time) # time1 = end_time - start_time # print('总时间',time1) # return new_func # @run_time ##for1=run_time(for1)###实际运行的是newfunc这个,换了个马甲for1 # def for1(n): # sum1 = 0 # for i in range(1,n+1): # sum1 += i # print(sum1) # for1(n) # # @run_time # def run(n): # print(n) # print('=============') # # # run(n) ########################### n = 9000000 ###可以拿到当前的时间模块datetime from datetime import datetime def run_time(func): ####func是for1 一个用来计算时间执行时间的装饰器 def new_func(*args,**kwargs): ##forl的参数n start_time=datetime.now() print('开始时间',start_time) func(*args,**kwargs) end_time=datetime.now() print('结束时间',end_time) time1 = end_time - start_time print('总时间',time1) return new_func @run_time ##for1=run_time(for1)###实际运行的是newfunc这个,换了个马甲for1 def for1(n): sum1 = 0 for i in range(1,n+1): sum1 += i print(sum1) @run_time def run(n): print(n) print('=============') @run_time def fun2(): print('========') for1(n) run(n) fun2()