day11 装饰器

# 装饰器形成的过程 : 最简单的装饰器 有返回值的 有一个参数的 万能参数的
# 装饰器的作用
# 原则 : 开放封闭原则
# 语法糖
# 装饰器的固定模式 [公式]


# def timmer(f): # 计算函数的执行时间
#     strat = time.time()
#     f()
#     end = time.time()
#     print(end - strat)

import time
# print(time.time()) # 从1970.1.1当现在过了多少秒,获取当前时间
# time.sleep(5) # 让程序执行到当前位置的时候 停 指定时间

# def timmer(f):    #装饰器函数
#     def inner():
#         strat = time.time()
#         ret = f()     #被装饰的函数
#         end = time.time()
#         print(end - strat)
#         return ret
#     return inner # 注意: !!!传内部函数名
#
#
# @timmer        # 语法糖 @装饰器函数名
# def func():     # 被装饰的函数
#     time.sleep(0.01)
#     print("hello boss,hello mates,hello everyone")
#     return "新年好"
#
# # func = timmer(func)
# ret = func()    # 此时的func()实际上是inner()
# print(ret)

# 装饰器的作用 ----- 不想修改函数的调用方式,但是还想在原来的函数前后添加功能
# timmer就是一个装饰器函数, 只是对一个函数 有一些装饰作用

# 原则: 开放封闭原则
# 开放:   对扩展是开放的
# 封闭:   对修改是封闭的

# def outer():
#     def inner():
#         return 'inner'
#     inner()
# outer()


# 装饰带参数函数的装饰器
# def timmer(f):    #装饰器函数
#     def inner(*args, **kwargs):
#         strat = time.time()
#         ret = f(*args, **kwargs)     #被装饰的函数
#         end = time.time()
#         print(end - strat)
#         return ret
#     return inner  # 注意: !!!传内部函数名
#
#
#
# @timmer        # 语法糖 @装饰器函数名
# def func(a):     # 被装饰的函数
#     time.sleep(0.01)
#     print("hello boss,hello mates,hello everyone",a)
#     return "新年好"
#
# @timmer        # 语法糖 @装饰器函数名
# def func(a, b):     # 被装饰的函数
#     time.sleep(0.01)
#     print("hello boss,hello mates,hello everyone",a,b)
#     return "新年好"
#
# # func = timmer(func)
# ret = func(1, 2)    # 此时的func()实际上是inner()
# ret = func(1, b=2)
# print(ret)

# def wrapper(f):    #装饰器函数, f是被装饰的函数
#     def inner(*args, **kwargs):
#         '''在被装饰函数之前要做的事'''
#         ret = f(*args, **kwargs)     #被装饰的函数
#         '''在被装饰函数之后要做的事'''
#         return ret
#     return inner  # 注意: !!!传内部函数名
#
#
# @wrapper        # 语法糖 @装饰器函数名
# def func(a, b):     # 被装饰的函数
#     time.sleep(0.01)
#     print("hello boss,hello mates,hello everyone",a,b)
#     return "新年好"

def wrapper(func):  #qqxing
    def inner(*args, **kwargs):
        ret = func(*args, **kwargs)     #被装饰的函数
        return ret
    return inner

@wrapper        # <===> qqxing = wrapper(qqxing)
def qqxing(a,b):
    print(123)

ret = qqxing(1,b=[1,2]) #inner()
print(ret)

 总结:

复习
讲作业
装饰器的进阶
    functools.wraps
    带参数的装饰器
    多个装饰器装饰同一个函数
周末作业
    文件操作
    字符串处理
    输入输出
    流程控制

装饰器
开发原则: 开放封闭原则
装饰器的作用: 在不改变原函数的调用方式的情况下,在函数的前后添加功能
装饰器的本质: 闭包函数

def wrapper(f):
    def inner(*args, **kwargs):
        print("在被装饰的函数执行之前做的事")
        ret = f(*args, **kwargs)
        print("在被装饰的函数执行之后做的事")
        return ret
    return inner


@wrapper
def holiday(day):
    print('全体放假%s天'%day)
    return '好开心'

ret = holiday(7)
print(ret)

def outer(*args, **kwargs):
    print(args)
    print(*args)
    def inner(*args):
        print('inner: ',args)
    inner(*args)

outer(1, 2, 3, 4) # == outer(*[1,2,3,4])
View Code

 

你可能感兴趣的:(day11 装饰器)