python-17-装饰器形成固定模型

前言

装饰器可能有点陌生,但是装饰器它也是由函数而组成,那它有什么作用呢?

其实就是:不想修改函数的调用方式,但可在原来的函数前后添加功能。开放封闭原则:

  • 对扩展是开放的
  • 对修改是封闭的

一、装饰器初成

1、还是这个例子,定义两个函数,func、timmer,简单来说 func 是执行所需的时间,timmer 是来计算传入的参数执行时长。

2、可以看到timmer函数里面有一个被装饰的函数。既是 func 传入 timmer。

# 1.装饰器初成
import time
def func():
    time.sleep(1)
    print('我在等待一秒钟')

def timmer(f):                  # 装饰器函数
    def inner():
        start = time.time()
        f()                      # 被装饰函数
        end = time.time()
        print(end-start)
    return inner                # 别加 () 调用函数了,应传内部函数名字

ff = timmer(func)
ff()

3、运行步骤如下图

 二、装饰器使用

1、装饰器函数 timmer

2、被装饰函数 func,直接@装饰器函数,执行顺序如上图所示。

# 2.装饰器使用
import time
def timmer(f): 
    def inner():
        start = time.time()
        ret = f()
        end = time.time()
        return end-start, ret
    return inner  

@timmer         # @装饰器函数名
def func():     # 被装饰的函数
    time.sleep(1)
    return '我在等待一秒钟'
print(func())

 三、万能参数装饰器

1、万能传参,其实就是用我们前面所学的函数传参方法,*args 和 **kwargs

# 3.万能参数装饰器
import time
def timmer(f): 
    def inner(*args, **kwargs):     # *args, **kwargs 万能接收参数
        start = time.time()
        ret = f(*args, **kwargs)     # *args, **kwargs 万能传入参数
        end = time.time()
        print(end-start)
        return ret
    return inner

@timmer
def func(a, b): 
    print(a, b)
    time.sleep(1)
    return '我在等待一秒钟'

@timmer         
def func1(a):   
    print(a)
    time.sleep(1)
    return '我在等待一秒钟'

print(func(1, 2))
print(func1(1))

四、装饰器固定模式

1、装饰器这样我们就可以游刃有余的写:在被装饰函数之 前 、后 要做的功能了。

2、固定模式如下:

# 4.装饰器固定模式
def wrapper(f):                     # 装饰器函数:wrapper   被装饰函数:f
    def inner(*args, **kwargs):     # 被装饰函数:inner == f
        # 在被装饰函数之 前 要做的功能
        ret = f(*args, **kwargs)
        # 在被装饰函数之 后 要做的功能
        return ret
    return inner

@wrapper        # @装饰器函数,实际相当于:wrapper(fon)
def fon(a):
    print('打酱油')
    return a

r = fon('固定模式就是这样')          # 实际相当于调用:inner
print(r)

 

有没有装饰器都不会影响原函数的执行,只是能够对现有的进行 前后 扩展,是不是很有必要掌握好的技能呢?

如有更多欢迎来QQ交流群:482713805

猜你喜欢

转载自www.cnblogs.com/gsxl/p/12104996.html