python—函数装饰器

闭包

如果在一个内部函数(函数里的函数)里,对在外部作用域(但不是在全局作用域,可以理解为外层函数)的变量进行引用,那么内部函数就被认为是闭包。

例如:

def outer():
    x=10             # 这里x即为外部作用域变量
    def inner():
        print(x)
    return inner     # inner函数被称为一个闭包

装饰器

写python代码一定要遵循开放封闭原则。即,可扩展功能,对源代码修改是封闭的。装饰是为函数和类指定管理代码的一种方式。装饰器本身的形式是处理其他的可调用对象的可调用的对象(如函数)。它们主要只是一种语法糖。

装饰器有两个原则:不改变原来函数的调用方法;不改变原来函数的源代码。

注:根据我自己的实验,递归函数尽量不要使用装饰器,否则会函数嵌套函数,出现各种bug;比如斐波那契函数:

import time
# 为函数增加 统计执行时长
def show_time(func):
    def inner(n):
        start_time=time.time()
        func(n)
        end_time=time.time()
        print("takes %d s"%(end_time-start_time))
        return func(n)
    return inner

#**********************
@show_time
def fibo(n):
    if 1 < n <= 3:
        return 1
    elif n==1:
	    return 0
    elif n<=0:
        return "please input an int greater than 0."
    return fibo(n-1)+fibo(n-2)

print(fibo(31))
#*********************** 星号这部分就会有问题

@show_time
def fib(n):
    a = 0
    b = 1
    if n >= 3:
        for i in range(n+1)[3:]:
            a,b=b,a+b
            result = b
        return result
    elif n == 1:
	    return a
    elif n ==0:
	    return b
    else:
	    return "please input an int greater than 0."

print(fib(80000))            # for循环的就没有问题

装饰器支持嵌套:

@A
@B
def C():
    print("in the c")

python装饰器有两种形式:

  • 函数装饰器在函数定义的时候进行名称重绑定,提供一个逻辑层来管理函数和方法或随后对它们的调用。
  • 类装饰器在类定义的时候进行名称重绑定,提供一个逻辑层来管理类,或管理随后调用它们所创建的示例。

装饰器举例:

import time

def show_time(func):
    def inner():
        start_time=time.time()
        func()
        end_time=time.time()
        print("takes %d s"%(end_time-start_time))
    return inner

@show_time             # 等于  foo=show_time(foo)
def foo():
    print("in the foo.")
    print("foo...")
    time.sleep(3)

@show_time             # 等于  bar=show_time(bar)
def bar():
    print("in the bar.")
    print("bar...")
    time.sleep(2)

装饰器参数:给装饰器加参数。还以上面例子来说,给bar函数加上日志记录,foo函数不加。

import time

def logger(flag=‘false‘):
    def show_time(func):
        def inner():
            start_time=time.time()
            func()
            end_time=time.time()
            print("takes %d s"%(end_time-start_time))
            if flag == ‘true‘:
                print("write logs...")
        return inner
    return show_time

#@show_time             # 等于  foo=show_time(foo)
@logger()
def foo():
    print("in the foo.")
    print("foo...")
    time.sleep(3)

#@show_time             # 等于  bar=show_time(bar)
@logger(‘true‘)
def bar():
    print("in the bar.")
    print("bar...")
    time.sleep(2)

原文地址:https://www.cnblogs.com/honker001/p/10100428.html

时间: 2024-10-04 17:44:14

python—函数装饰器的相关文章

python函数装饰器

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

Python 函数装饰器入门

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