python开发【函数】:装饰器的诞生

计算函数的运行时间

import time
def bar():
    print("in the bar")
    time.sleep(2)
def foo(func):
    start_time=time.time()
    func()
    end_time=time.time()
    print("in the foo")
    print("该函数运行的时间是%s"%(end_time-start_time))
foo(bar)

虽然已经实现功能,但是改变了函数bar的调用方式,优化后如下:

import time
def bar():
    print("in the bar")
    time.sleep(2)
def foo(func):
    start_time=time.time()
    print("in the foo")
    return func
    end_time=time.time()
    print("该函数运行的时间是%s"%(end_time-start_time))
bar=foo(bar)
bar()
-------------输出------------------
in the foo
in the bar

总结:函数bar的调用方式未改变,但是与题目要求又不一致,函数遇到return后结束了,未输出运行函数的时间,继续优化:

import time
def foo(func):
    def inner():
        start_time=time.time()
        print("in the foo")
        func()
        end_time=time.time()
        print("该函数运行的时间是%s"%(end_time-start_time))
    return inner
@foo#bar=foo(bar)=inner
def bar():
    print("in the bar")
    time.sleep(2)
bar()
-------------输出------------------
in the foo
in the bar
该函数运行的时间是2.0122246742248535

总结:此时装饰器的雏形已形成,那如果函数带参数的话,会是怎么样了,继续搞。

import time
def foo(func):
    print("in the foo")
    def inner(*args,**kwargs):
        start_time=time.time()
        print("in the inner")
        func(*args,**kwargs)
        end_time=time.time()
        print("该函数运行的时间是%s"%(end_time-start_time))
    return inner
@foo #bar=foo(bar)=inner
def bar(x,y):
    a=x+y
    print("in the bar")
    print("两数相加和为%s"%a)
    time.sleep(2)
bar(3,5)
-------------输出------------------
in the foo #无论函数是否运行,都会默认执行这一步
in the inner
in the bar
两数相加和为8
该函数运行的时间是2.0000240802764893

总结:无论函数是否执行,都会默认先执行foo函数的,就是这么给力,那如果函数还有返回值了,怎么弄了

import time
def foo(func):
    print("in the foo")
    def inner(*args,**kwargs):
        start_time=time.time()
        print("in the inner")
        res=func(*args,**kwargs)
        print("函数的返回值为:%s"%res)
        end_time=time.time()
        print("该函数运行的时间是%s"%(end_time-start_time))
    return inner
@foo #bar=foo(bar)=inner
def bar(x,y):
    a=x+y
    print("in the bar")
    time.sleep(2)
    return a
bar(3,5)
-------------输出------------------
in the foo
in the inner
in the bar
函数的返回值为:8
该函数运行的时间是2.000295639038086

总结:只是稍加变动就搞定了,那如果装饰器也带参数,实现只有在特定情况下计算函数运行的时间,否则不执行

import time
def foo(auth_type):
    print("in the foo")
    def outer(func):
        print("in the outer")
        def inner(*args,**kwargs):
            if auth_type=="run":
                start_time=time.time()
                print("in the inner")
                res=func(*args,**kwargs)
                print("函数的返回值为:%s"%res)
                end_time=time.time()
                print("该函数运行的时间是%s"%(end_time-start_time))
            else:
                print("输入的auth_type不是run")
        return inner
    return outer
@foo("run") #1、outer=foo("run"),2、bar=outer(bar)=inner
def bar(x,y):
    a=x+y
    print("in the bar")
    time.sleep(2)
    return a
bar(3,5)
-------------输出------------------
in the foo#只要加了装饰器,会默认输出
in the outer#只要加了装饰器,会默认输出
in the inner
in the bar
函数的返回值为:8
该函数运行的时间是2.0101609230041504

总结:完美搞定,加了装饰器的效果后,会首先运行foo("run")得到outer,然后把函数bar当作参数传入给outer得到outer(bar)运行后得到inner。

原文地址:https://www.cnblogs.com/yan-long/p/9461661.html

时间: 2024-11-10 19:13:53

python开发【函数】:装饰器的诞生的相关文章

python之函数装饰器

今日内容总结:装饰器(闭包函数的一种应用)无参装饰器有参装饰器 装饰器(闭包函数的一种应用) 1. 什么是装饰器器:指的是具备某一功能的工具装饰:指的是为被装饰器对象添加新功能 装饰器就是用来为被装饰器对象添加新功能的工具 需要注意的是:装饰器本身可以是任意可调用对象,被装饰器的对象也可以是任意可调用对象 2. 为何要用装饰器因为在实际开发环境中,是不允许对原代码进行操作,而且不能破坏原有的调用关系,根据实际要求还需要增添新功能开发需要遵循的一个原则开放封闭原则:封闭指的是对修改封闭,对扩展开放

十、python开发之装饰器

一.装饰器:(decorator) 介绍:1.本质是函数,为其他函数添加附加功能. 2.不能修改被装饰的函数的源代码. 3.不能修改被装饰的函数的调用方式. 定义:高阶函数+嵌套函数==>装饰器 二.定义一个函数并为其添加一个计时功能的装饰器 import time def func1(func): def func2(*args): start_time = time.time() func(*args) stop_time = time.time() print("program ru

Python Day4 函数 装饰器

内置函数: 参考 https://docs.python.org/2/library/functions.html 装饰器 装饰器是函数,只不过该函数可以具有特殊的含义,装饰器用来装饰函数或类,使用装饰器可以在函数执行前和执行后添加相应操作 # 定义函数,为调用,函数内部不执行 # 函数名 > 代指函数 # @ + 函数名 # 功能: #     1. 自动执行outer函数并且将其下面的函数名f1当作参数传递 #     2. 将outer函数的返回值,重复赋值给 f1 example 1:

python 匿名函数&装饰器

匿名函数 关键字lambda表示匿名函数,冒号前面的x表示函数参数匿名函数有个限制,就是只能有一个表达式,不用写return,返回值就是该表达式的结果. >>> list(map(lambda x: x * x, [1, 2, 3, 4, 5, 6, 7, 8, 9]))[1, 4, 9, 16, 25, 36, 49, 64, 81] 可以把匿名函数赋值给一个变量,再利用变量来调用该函数:>>> f = lambda x: x * x>>> f<

python 之 函数 装饰器

5.8 装饰器 1 开放封闭原则 软件一旦上线后,就应该遵循开放封闭原则,即对修改源代码是封闭的,对功能的扩展是开放的 也就是说我们必须找到一种解决方案: 能够在不修改一个功能源代码以及调用方式的前提下,为其加上新功能 原则如下: 1.不修改源代码 2.不修改调用方式 目的: 在遵循1和2原则的基础上扩展新功能 装饰器: 装饰器即在不修改被装饰对象源代码与调用方式的前提下,为被装饰器对象添加新功能,装饰器与被装饰的对象均可以是任意可调用的对象 装饰器 ===>函数 被装饰的对象 ===>函数

Python高阶函数与函数装饰器-day4

上节回顾 高阶函数 闭包函数 函数装饰器 模块导入 一.上节回顾 Python2与Python3字符编码问题,不管你是初学者还是已经对Python的项目了如指掌了,都会犯一些编码上面的错误.我在这里简单归纳Python3和Python2各自的区别. 首先是Python3-->代码文件都是用utf-8来解释的.将代码和文件读到内存中就变成了Unicode,这也就是为什么Python只有encode没有decode了,因为内存中都将字符编码变成了Unicode,而Unicode是万国码,可以"

Python 函数对象 命名空间与作用域 闭包函数 装饰器 迭代器 内置函数

一.函数对象 函数(Function)作为程序语言中不可或缺的一部分,但函数作为第一类对象(First-Class Object)却是 Python 函数的一大特性. 那到底什么是第一类对象(First-Class Object)呢? 在 Python 中万物皆为对象,函数也不例外,函数作为对象可以赋值给一个变量.可以作为元素添加到集合对象中.可作为参数值传递给其它函数,还可以当做函数的返回值,这些特性就是第一类对象所特有的. 1.函数身为一个对象,拥有对象模型的三个通用属性:id.类型.和值.

python函数装饰器

学习装饰器前提需要了解高阶函数,函数嵌套,函数闭包 python函数装饰器,顾名思义就是装饰函数,为函数添加新功能的的一种方式. 为什么要使用装饰器呢? 因为函数在运行时,如果不使用装饰器对函数进行功能添加,需要修改函数源代码,这样修改无疑会增加程序的冗余和复杂性,也不便于程序员对其进行修改.使用装饰器,可以在不改变函数源代码和调用方式的前提下,使用语法糖@装饰器,对函数功能进行添加. 装饰器本质上就是一个函数. 我们使用一个简单的例子来实现: import time #这是一个装饰器函数名为t

Python 函数装饰器和闭包

p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 25.0px Helvetica } 装饰器基础知识 装饰器是可调用的对象,其参数是另一个函数(被装饰的函数). 装饰器可能会处理被装饰的函数,然后把它返回,或者将其替换成另一个函数或可调用对象. p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 15.0px Helvetica } 假如有个名为 decorate 的装饰器: @decorate def targ

Python 函数装饰器入门

原文链接: --> A guide to Python's function decorators Python功能强劲,语法表现力强,尤其装饰器深深的吸引着我.在设计模式中,装饰器可以在不使用子类的情况下,动态的改变函数,方法以及类的功能.这个功能非常有用,特别在你想扩展函数的功能同时又不想改变原有的函数.的确,我们任意的实现装饰器设计模式,但是,python通过提供简单的语法和特性让装饰器的实现变的如此简单. 在本文中,我将用一组例子来深入浅入python 函数装饰器的功能,所有的例子都是在