Python装饰器

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