python函数装饰器

学习装饰器前提需要了解高阶函数,函数嵌套,函数闭包

python函数装饰器,顾名思义就是装饰函数,为函数添加新功能的的一种方式。

为什么要使用装饰器呢?

因为函数在运行时,如果不使用装饰器对函数进行功能添加,需要修改函数源代码,这样修改无疑会增加程序的冗余和复杂性,也不便于程序员对其进行修改。使用装饰器,可以在不改变函数源代码和调用方式的前提下,使用语法糖@装饰器,对函数功能进行添加。

装饰器本质上就是一个函数。

我们使用一个简单的例子来实现:

import time
#这是一个装饰器函数名为timer
def timer(func):#将原函数(func)以参数形式传入装饰器函数
    def wapper():#定义装饰函数wapper
        start_time=time.time()
        func()#调用原函数
        stop_time=time.time()
        print("程序的运行时间为%s"%(stop_time-start_time))
    return wapper#返回wapper函数给timer

@timer#定义index=timer(index)
def index():
    time.sleep(2)
    print("这是一个测试程序")

index()

以上是一个无参数装饰器,有时候我们需要用到带参数的装饰器,比如登录验证,

import time
#这是一个装饰器函数名为timer
def timer1(auth_type):
    print(auth_type)#打印auth_type值,方便自己查看程序流程
    def timer(func):#将原函数(func)以参数形式传入装饰器函数
        def wapper():#定义装饰函数wapper
            if auth_type=="file":
                start_time=time.time()
                func()#调用原函数
                stop_time=time.time()
                print("程序的运行时间为%s"%(stop_time-start_time))
            else:
                print("不知道你输入的是什么")
        return wapper#返回wapper函数给timer
    return timer#返回timer给timer1

@timer1(auth_type="file")#定义index=timer(index(auth_type))
def index():
    time.sleep(2)
    print("这是一个测试程序")

index()

在使用装饰器过程中我们发现原函数的源信息不见了,当我们需要原函数的返回值,在原函数处是无法返回也没有的,这就需要我们重新理解装饰器语法糖的作用,不难发现,原函数已经变为装饰器中的函数wapper

以下实例根据以上代码试验:

通过使用,我们发现原函数的元信息显示结果为none

@timer1(auth_type="file")#定义index=timer(index(auth_type))
def index():
    """这是原函数信息"""
    time.sleep(2)
    print("这是一个测试程序")
print(index.__doc__)

#结果为none

经过试验,可以验证,被修饰函数的元信息在装饰器中添加会有效打印

 def wapper():#定义装饰函数wapper
            """装饰器中的元信息"""

针对这种情况,我们可以使用functools.wraps  wraps本身也是一个装饰器,他能把原函数的的元信息拷贝到装饰器中,使装饰器函数有原函数一样的源信息

from functools import wraps#调用工具
def timer1(auth_type):
    print(auth_type)#打印auth_type值,方便自己查看程序流程
    def timer(func):#将原函数(func)以参数形式传入装饰器函数
        @wraps(func)将该工具装饰器插入到装饰器函数正上方
        def wapper():#定义装饰函数wapper

我们也可以定义多个装饰器给函数使用,需要注意的是装饰器的调用顺序

@a

@b

@c

def f()

这种装饰就等效于f=a(b(c(f)))

时间: 2024-10-14 03:03:23

python函数装饰器的相关文章

Python 函数装饰器入门

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

python—函数装饰器

闭包 如果在一个内部函数(函数里的函数)里,对在外部作用域(但不是在全局作用域,可以理解为外层函数)的变量进行引用,那么内部函数就被认为是闭包. 例如: def outer(): x=10 # 这里x即为外部作用域变量 def inner(): print(x) return inner # inner函数被称为一个闭包 装饰器 写python代码一定要遵循开放封闭原则.即,可扩展功能,对源代码修改是封闭的.装饰是为函数和类指定管理代码的一种方式.装饰器本身的形式是处理其他的可调用对象的可调用的

python函数装饰器详解

基础:函数装饰器的表现方式 假如你已经定义了一个函数funcA(),在准备定义函数funcB()的时候,如果写成下面的格式: @funcA def funcB():... 表示用函数funcA()装饰函数funcB().当然,也可以认为是funcA包装函数funcB.它等价于: def funcB():... funcB = funcA(funcB) 也就是说,将函数funcB作为函数funcA的参数,funcA会重新返回另一个可调用的对象(比如函数)并赋值给funcB. 所以,funcA要想作

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函数--装饰器进阶

开放封闭原则 1.对扩展是开放的 为什么要对扩展开放呢? 我们说,任何一个程序,不可能在设计之初就已经想好了所有的功能并且未来不做任何更新和修改.所以我们必须允许代码扩展.添加新功能. 2.对修改是封闭的 为什么要对修改封闭呢? 就像我们刚刚提到的,因为我们写的一个函数,很有可能已经交付给其他人使用了,如果这个时候我们对其进行了修改,很有可能影响其他已经在使用该函数的用户. 装饰器完美的遵循了这个开放封闭原则. *args,**kwargs def f1(*args,**kwargs):   接

python 函数 装饰器的使用方法

一.装饰器  首先,我们要了解到什么是开放封闭式原则? 软件一旦上线后,对修改源代码是封闭的,对功能的扩张是开放的,所以我们应该遵循开放封闭的原则. 也就是说:我们必须找到一种解决方案,能够在不修改一个功能源代码以及调用方式的前提下,为其加上新功能. 总结:原则如下: 1.不修改源代码 2.不修改调用方式 目的:在遵循1和2原则的基础上扩展新功能. 二.什么是装饰器? 器:指的是工具, 装饰:指的是为被装饰对象添加新功能. 完整的含义:装饰器即在不修改装饰对象源代码与调用方式的前提下,为被装饰器

python函数装饰器的使用

# -*- coding: utf-8 -*- ''' 使用语法糖@来装饰函数,相当于"myfunc = deco(myfunc)" 但发现deco函数只在第一次被调用,且myfunc函数在第一次后又被多调用了一次 ''' def deco(func): print("before myfunc() called.") func() print("after myfunc() called.") return func bool=0 @deco

python 函数装饰器

举个例子 def a_decorator(func): def wrapTheFunc(): print "before decorator" func() print "end decorator" return wrapTheFunc @a_decorator def a_func_need_decorator(): print "In a_func_need_decorator()" a_func_need_decorator() 输出 b

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

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