python中装饰器的原理

装饰器这玩意挺有用,当时感觉各种绕,现在终于绕明白了,俺滴个大爷,还是要慢慢思考才能买明白各种的真谛,没事就来绕一绕

def outer(func):    def inner():        print("认证成功")        result=func()        print("登录成功")        return result    return inner@outerdef OA():    print("OA接口")

这里面需要注意的是:

  • @outer和@outer()有区别,没有括号时,outer函数依然会被执行,这和传统的用括号才能调用函数不同,需要特别注意!
  • 是OA这个函数名(而不是OA()这样被调用后)当做参数传递给装饰函数outer,也就是:func = OA,@outer等于outer(OA),实际上传递了OA的函数体,而不是执行OA后的返回值。
  • outer函数return的是inner这个函数名,而不是inner()这样被调用后的返回值。

 1. 程序开始执行outer函数内部的内容,一开始它又碰到了一个函数,inner函数定义块被程序观察到后不会立刻执行,而是读入内存中。

 2. 再往下,碰到return inner,返回值是个函数名,并且这个函数名会被赋值给OA这个被装饰的函数,也就是OA = inner,此时OA函数被新的函数inner覆盖了(实际上是OA这个函数名更改成指向inner这个函数名指向的函数体内存地址,OA不再指向它原来的函数体的内存地址),再往后调用OA的时候将执行inner函数内的代码,而不是先前的函数体。那么先前的函数体去哪了?还记得我们将OA当做参数传递给func这个形参么?func这个变量保存了老的函数在内存中的地址,通过它就可以执行 老的函数体,你能在inner函数里看到result = func()这句代码,它就是这么做的!

 3.接下来,还没有结束,依然通过OA()的方式调用OA 函数时,执行的就不再是老的OA函数的代码,而是inner函数的代码。在本例中,它首先会打印个“认证成功”的提示,然后,它会执行func函数并将返回值赋值个变量result,这个func函数就是老的OA函数;接着,它又打印了“登陆成功”的提示;最后返回result这个变量。我们可以用 r = OA()的方式接受result的值。

 4.仅仅是添加了一个装饰函数,就实现了我们的需求,在函数调用前先认证,调用后写入日志,这就是装饰器的最大作用。



原文地址:https://www.cnblogs.com/python2687806834/p/9897641.html

时间: 2024-07-29 13:24:16

python中装饰器的原理的相关文章

8.Python中装饰器是什么?

Python中装饰器是什么? A Python decorator is a specific change that we make in Python syntax to alter functions easily. Python decorator是我们在Python语法中使用的一个特定的更改,可以轻松地改变函数. http://www.cnblogs.com/zoe233/p/7070067.html 装饰器定义: 本质是函数.函数的目的是为了完成特定的功能,那么装饰器的功能是什么呢?

对Python中装饰器(Decorator)的理解与进阶

有时候我们项目中的某些功能做些修改即需要对内部的某些函数添加一些附加功能,但是为了安全起见不想改变函数的源代码以及函数的调用方式,那么装饰器在这个地方会给我们带来很大的帮助. 装饰器(Decorator):(又叫语法糖) 定义:本质是函数,功能(装饰其它函数)就是为其他函数添加附加功能 原则:(1).不能修改被装饰的函数的源代码 (2).不能修改被装饰的函数的调用方式 1.先来实现一个简单的装饰器示例: #!/usr/bin/env python # -*- coding:utf-8 -*- #

【转】【python】装饰器的原理

写在前面: 在开发OpenStack过程中,经常可以看到代码中的各种注解,自己也去查阅了资料,了解了这是python中的装饰器,因为弱类型的语言可以将函数当成返回值返回,这就是装饰器的原理. 虽然说知道装饰器的使用方法以及原理,但是一直不明白为什么要通过在内部函数返回一个函数名这样的写法,在微信上看到下面这篇文章,豁然开朗.因为觉得写的非常好,所以我也没必要再来写一遍了,直接转载,供以后的开发中参考. -----------------------------------------------

Python中装饰器(转)

本文由 伯乐在线 - 7even 翻译,艾凌风 校稿.未经许可,禁止转载!英文出处:Simeon Franklin.欢迎加入翻译组. 好吧,我标题党了.作为 Python 教师,我发现理解装饰器是学生们从接触后就一直纠结的问题.那是因为装饰器确实难以理解!想弄明白装饰器,需要理解一些函数式编程概念,并且要对Python中函数定义和函数调用语法中的特性有所了解.使用装饰器非常简单(见步骤10),但是写装饰器却很复杂. 虽然我没法让装饰器变得简单,但也许通过将问题进行一步步的讲解,可以帮助你更容易理

Python编程系列---Python中装饰器的几种形式及万能装饰器

根据函数是否传参  是否有返回值 ,可以分析出装饰器的四种形式: 形式一:无参无返回值 1 def outer(func): 2 def wrapper(): 3 print("装饰器功能1") 4 ret = func() 5 print("装饰器功能2") return ret 6 return wrapper 7 8 # 定义一个无参无返回值的函数 9 @outer 10 def main_func(): 11 print("hello")

python中装饰器修复技术

python装饰器@wraps作用-修复被装饰后的函数名等属性的改变 Python装饰器(decorator)在实现的时候,被装饰后的函数其实已经是另外一个函数了(函数名等函数属性会发生改变), 为了不影响,Python的functools包中提供了一个叫wraps的decorator来消除这样的副作用.写一个decorator的时候,最好在实现之前加上functools的wrap, 它能保留原有函数的名称和docstring. 未加@wraps的时候: from functools impor

Python中装饰器的用法

定义: 装饰器本身就是一个函数 为其他函数提供附加功能 不改变源代码 不改变原调用方式 装饰器=高阶函数+嵌套函数 知识点: 函数本身就是一个变量(意味着可以被复制给一个变量:test=test(1) ) 高阶函数 把函数名当成一个实参传递给另一个函数func(test1) (不改变源代码的前提下添加代码) 返回值中包含函数名return deco (不改变函数的调用方式) 嵌套函数:函数中加入新的函数def func1(): def func2(): 典型结构: 1 def func1(tes

python中装饰器你真的理解吗?

def w1(func): print('装饰器1....') def w1_in(): print('w1_in.....') func() return w1_in def w2(func): print('装饰器2.....') def w2_in(): print('w2_in......') func() return w2_in @w1 @w2 def f1(): print('f1....') f1() 你知道上面的代码执行的步骤吗?........................

python之装饰器 实例

=====================================写法1========================== import time def timer(func):     def deco():         start_time = time.time()         func()         stop_time = time.time()         print('the func run time is %s' %(stop_time - star