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

前言

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

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

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

1、装饰器初成

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

二、能够看到timmer函数里面有一个被装饰的函数。既是 func 传入 timmer。code

# 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()

三、运行步骤以下图blog

 2、装饰器使用

一、装饰器函数 timmerclass

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

# 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())

 3、万能参数装饰器

一、万能传参,其实就是用咱们前面所学的函数传参方法,*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))

4、装饰器固定模式

一、装饰器这样咱们就能够游刃有余的写:在被装饰函数之 前 、后 要作的功能了。方法

二、固定模式以下:im

# 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

相关文章
相关标签/搜索