装饰指的是为被装饰器对象添加额外功能
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()
