一、装饰器:

  1.1 装饰器原则:

    对扩展开发
    对修改封闭
    不改变调用方式

  1.2 应用场景:

    框架
    面向对象
    程序登录认证等

  1.3 装饰器建立与示例:

    1.3.1 装饰器建立:

  
import time

# 装饰器
def warpper(f):   # 接收被装饰的函数内存地址

    # 装饰器闭包函数
    def inner(*args, **kwargs):
        print('.........start..........')
        start_time = time.time()   # 起始时间
        f(*args, **kwargs)    # 调用被装饰的函数 func1 func2
        end_time = time.time()   # 结束时间
        print('这个{} 函数,执行时间为:{}'.format(f.__name__, end_time - start_time))
        print('.........end..........')

    return inner


# 装饰器普通调用(方法一):

# 普通传参
# 被装饰函数
def func1(s):      # 普通传参
    print(s)  # 打印位置参数
    print('这是一个旧函数')
    time.sleep(1)   # 睡一秒

func = warpper(func1)
func(5)



# 动态传参
# 被装饰函数
def func2(*args, **kwargs):
    print(args)  # 打印动态位置参数
    print(kwargs)   #  打印动态默认参数
    print('这是一个旧函数')
    time.sleep(1)   # 睡一秒

func = warpper(func2)
func(5, 2, **{'a': 1, 'b': 2})




# 装饰器语法糖调用(方法二):

def warpper(f):  # 接收被装饰的函数内存地址
    def inner(*args,**kwargs):  # 接受被装饰函数的参数
        start_time = time.time() # 新功能
        ret = f(*args,**kwargs)  # 调用被装饰的函数,被装饰参数带上
        end_time = time.time()
        print('%s函数的运行时间:%s'%(f.__name__,end_time - start_time))
        return ret               # 被装饰的函数返回值
    return inner

@warpper       # func = warpper(func)  语法糖
def func(*args,**kwargs):
    print(args)   # 打印被装饰的函数参数
    print('这是主功能!')
    time.sleep(1)
    return '小姐姐'  # 返回值
ret = func(5)   # ret = func(5)  == inner(5)  返回值  func(5)
print(ret)  # 被装饰的函数返回值 小姐姐
View Code

相关文章: