装饰器工厂函数

"""
需求:参数传入0 希望时间用整数显示,参数传入1 用浮点数显示
"""
import time

def get_run_time(flag):
    """装饰器工厂函数"""

    def get_time(func):
        """装饰器函数:对函数运行时间进行统计"""
        print(‘in get_time‘)

        def inner(*args, **kwargs):
            t1 = time.time()
            res = func(*args, **kwargs)
            t2 = time.time()
            if flag == 0:
                print(‘运行了%d s‘ % (t2 - t1))
            else:
                print(‘运行了%f s‘ % (t2 - t1))
            return res

        return inner

    return get_time

# 装饰器工厂函数的作用:
# 1.>接收装饰器函数所需要但是又不能直接接受的参数---->接收参数
# 2.>生产装饰器对象---->产生装饰器函数

# 关联: 装饰器工厂内部是装饰器函数
# 真正执行过程:
# 1.> get_time = get_run_time(参数)
# 2.> @get_time 对func1函数进行装饰  func1 = get_time(func1)
@get_run_time(0)  # 这句话的返回值是get_time这个函数名
def func1(num, age=18):
    for i in range(3):
        time.sleep(1)
        print(‘in func‘, num, age)

# @get_run_time(1) 注意:这个要分开看    f1 = get_run_time(1) 这是一个整体,函数调用,然后返回一个值
# @f1 这才是真正的装饰器函数开始了

func1(89)

"""
问题:
1.>装饰器工厂函数是装饰器函数吗?
不是,工厂内部定义了装饰器函数,并且return装饰器函数的引用
2.>装饰器工厂函数和装饰器的关系?
工厂的返回值是装饰器函数的引用.它的作用就是创建一个装饰器函数的对象<或者叫地址引用更合适>
"""

多个装饰器装饰一个函数:

"""
<i> 斜体
<b> 加粗,黑体

多个装饰器:同时扩展多个功能
"""

def makeBold(func):
    """加粗"""
    def inner(*args,**kwargs):
        return ‘<b>‘ + func() + ‘</b>‘
    return inner

def makeItalic(func):
    """倾斜"""
    def inner(*args,**kwargs):
        return ‘<i>‘ + func() + ‘</i>‘
    return inner

@makeItalic
@makeBold
@makeItalic
def f1():
    return ‘人生苦短,我用Python‘

print(f1())
# <i><b><i>人生苦短,我用Python</i></b></i>

# 执行顺序,先倾斜,后加粗, 类似于穿衣服,内衣先,外套后

# 灵魂代码理解:  f1 = makeItalic(f1)

# 1.>f11 = makeItalic(f1) f11是  makeItalic 里面的inner ;
# 2.>f111 = makeBold(f11) f111是makeBold 里面的inner

# 一步理解:  f1 = makeBold(makeItalic(f1))    ------> 简单理解就是多层装饰了
# 类似于寄快递,自己包一层之后快递小哥也会帮你再去 包一层.

# 执行顺序一定是先去执行最内层的.<最内层的装饰器先完成装饰>
# 但是是最外层的最先开始装饰,它需要内层的装饰完成才能去装饰.

原文地址:https://www.cnblogs.com/huaibin/p/12101187.html

时间: 2024-10-08 07:26:35

装饰器工厂函数的相关文章

关于Python装饰器内层函数为什么要return目标函数的一些个人见解

https://blog.csdn.net/try_test_python/article/details/80802199 前几天在学装饰器的时候,关于装饰器内层函数调用目标函数时是否return目标函数的调用产生了一点迷惑,事实是当被装饰的目标函数有返回值的时候,装饰器内层函数也必须返回该目标函数的调用. 我们都知道不带括号的函数名指向是函数代码所在的内存地址,加上括号之后就变成了一个执行命令,那么这个'func( )'到底有什么意义呢? 上面这张图可以大概看出点东西,单独的函数名是 fun

diango中让装了装饰器的函数的名字不是inner,而是原来的名字

让装了装饰器的函数的名字不是inner,而是原来的名字 from functools import wraps def wrapper(func): @wraps(func) # 复制了原来函数的名字和注释 def inner(request,*arg,**kwargs): # 之前 ret = func(request,*arg,**kwargs) # 之后 return ret return inner @wrapper # f1 = wrapper(f1) def f1(request):

python笔记--3--函数、生成器、装饰器、函数嵌套定义、函数柯里化

函数 函数定义语法: def 函数名([参数列表]): '''注释''' 函数体 函数形参不需要声明其类型,也不需要指定函数返回值类型 即使该函数不需要接收任何参数,也必须保留一对空的圆括号 括号后面的冒号必不可少 函数体相对于def关键字必须保持一定的空格缩进 Python允许嵌套定义函数 在定义函数时,开头部分的注释并不是必需的,但是如果为函数的定义加上这段注释的话,可以为用户提供友好的提示和使用帮助. Python是一种高级动态编程语言,变量类型是随时可以改变的.Python中的函数和自定

装饰器(函数)

闭包 1.作用域L_E_G_B(局部.内嵌.全局...): 1 x=10#全局 2 3 def f(): 4 a=5 #嵌套作用域 5 def inner(): 6 count = 7 #局部变量 7 print a 8 return 1 从内往外寻找 a . 2.高阶函数 a.函数名可以作为参数输入 b.函数名可以作为返回值 3.闭包 1 def outer(): 2 x=10 3 def inner(): #条件1 inner是内部函数 4 print(x) #条件2 外部环境的一个变量 5

使用装饰器进行函数类型检查

动态类型的特性使得Python函数在被调用时,其参数类型不易被知晓.或者,为了动态支持多类型,实际参数的类型由调用者提供.如下: def add(x, y): return x + y print(add(2, 3)) # 5 print(add('Hello', ' World')) # Hello World 上面的例子可以看出,函数参数并没有指定类型,使得该函数支持多种类型,这也正是Python语言的特殊之处. 但有时候,我们想限制函数的参数类型.这时很多人会想到类型提示(Type Hin

Python学习(十)—— 装饰器和函数闭包

装饰器 装饰器:本质就是函数,功能是为其他函数添加附加功能 原则: 1.不修改被修饰函数的源代码 2.不修改被修饰函数的调用方式 统计程序运行的时间(不使用装饰器): 这种方法修改了源代码,不能用于已经上线的程序 1 import time 2 def calc(l): 3 res = 0 4 start_time = time.time() 5 for i in l: 6 res += i 7 time.sleep(0.01) 8 stop_time = time.time() 9 print

装饰器与函数的多层嵌套

# coding: utf-8 def login(func): print("the first level") def inner1(*args): print("the second level") def inner2(*args): print("the third level") def inner3(*args): print("the forth level") func(*args) func(*args)

函数装饰器和闭包(四)

上一章:函数装饰器和闭包(三) 单分派函数 假设我们现在要开发一个函数,这个函数可以传入一个元素,函数要判断元素的类型,再将其打印出来 from collections.abc import MutableSequence, MutableMapping def print_item(item): if isinstance(item, int): print("int:", item) elif isinstance(item, MutableSequence): print(&qu

typeScript 装饰器

装饰器是一种特殊类型的声明,它能够被附加到类声明,方法, 访问符,属性或参数上. 装饰器使用@expression这种形式,expression求值后必须为一个函数,它会在运行时被调用,被装饰的声明信息做为参数传入. 例如,有一个@sealed装饰器,我们会这样定义sealed函数: function sealed(target) { // do something with "target" ... } 装饰器工厂 如果我们要定制一个修饰器如何应用到一个声明上,我们得写一个装饰器工厂