python装饰器(补充完整)

      一、什么是装饰器

              1、对现有已经实现功能的代码进行扩展。

       2、不用修改被撞时对象的源代码和调用方法

        

       二、装饰器的使用

      无参数装饰器:

       示例:

        

           def zsq(func):

             def yz(args):

            print("验证")

             return func(args)

             return yz

            @zsq

            def hs(name):

            print("我是一个函数%s"%name)

            return "hs fanhuizhi"

            ceshi = hs("wz")

             print(ceshi)

      

       执行过程:

      1、将zsq加载到内存中。

       2、碰到@zsq,会执行zsq函数将@zaq下的函数当作参数传入zsq中(相当于zsq(hs))。

      3、此时func形参等于hs函数,读取yz函数到内存,return yz函数的内存地址到hs函数(@zsq就相当于(hs = zsq(hs)))。

      4、此时执行ceshi = hs(“wz”),由于hs被return 回来的yz函数覆盖,这里执行的就相当于ceshi = yz(“wz”)。

       5、执行yz函数,首先print(“验证”),然后return func(args),这句return func(args)的意思是执行func函数并把函数的返回值返回给调用yz函数的对象,而调用yz函数的为ceshi = hs(“wz”),所以这一步就是把返回值传给hs(“wz”)并赋值给ceshi变量。

      6、在这里执行func(args)由于第三步的时候func等于hs函数所以就相当于执行hs函数。

      

  

    有参数装饰器:

      示例:

                  

    def hs1(canshu1, canshu2):

print("第一个函数")

def hs2(canshu1, canshu2):

print("第二个函数")

def zsq(hs_1, hs_2):

def home(home_func):

def panduan(pd1, pd2):

hs1_return = hs_1(pd1, pd2)

if (hs1_return != None):

return hs1_return

home_return = home_func(pd1, pd2)

if (home_return != None):

return home_return

hs2_return = hs_2(pd1, pd2)

if (hs2_return != None):

return hs2_return

return panduan

return home

@zsq(hs1, hs2)

def index(canshu1, canshu2):

print("index")

index(‘w‘,‘z‘)

      

       #执行过程

      1、解释器从上往下解释python代码首先将hs1函数加载到内存,然后把hs2和zsq函数也加在到内存。

      2、碰到@zsq(hs1, hs2),解释器首先会执行zsq(hs1, hs2),把hs1和hs2当作参数传给zsq赋值给zsq的形参hs_1和hs_2(这里相当于@zsq = zsq(hs1,hs2))。

       3、将home函数加载到内存并return给@zsq。

       4、执行装饰器将index函数当作值传给zsq函数,由于@zsq已被home函数覆盖这时候相当于执行index = home(index)。

       5、读取panduan函数到内存中并把panduan函数的内存地址返回给调用home函数的index中。

      6、执行index(‘w’,’z’),由于index被panduan覆盖这里就相当于执行panduan(‘w’,’z’)。

       7、执行panduan函数中的代码(不再赘述…)

    

      三、装饰器语法:

       被装饰函数的正上方,单独一行

       @deco1

      @deco2

       @deco3

      def foo():

      pass

      foo=deco1(deco2(deco3(foo)))

      四、装饰器补充:wraps

       from functools import wraps

       def deco(func):

       @wraps(func) #加在最内层函数正上方

       def wrapper(*args,**kwargs):

      return func(*args,**kwargs)

       return wrapper

      @deco

       def  index():

      ‘‘‘哈哈哈哈‘‘‘

       print(‘from index‘)

       print(index.__doc__)

原文地址:https://www.cnblogs.com/qingmu6/p/8918975.html

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

python装饰器(补充完整)的相关文章

Python 装饰器补充

定义了一些函数,这些函数都要被外部所调用,但是这些函数在被调用之前,都有些相同的功能需要被实现,在这种情况下,装饰器是最好的解决方案: def f1(): print ("F1") def f2(): print ("F2") 在另一个模块中调用的时候 import s1 s1.f1() s1.f2()执行结果:F1F2 这个时候,我们需要在f1,f2中分别添加打印日志的功能,于是,函数的定义变成了 def f1(): print ("log")

深入浅出 Python 装饰器:16 步轻松搞定 Python 装饰器

Python的装饰器的英文名叫Decorator,当你看到这个英文名的时候,你可能会把其跟Design Pattern里的Decorator搞混了,其实这是完全不同的两个东西.虽然好像,他们要干的事都很相似--都是想要对一个已有的模块做一些"修饰工作",所谓修饰工作就是想给现有的模块加上一些小装饰(一些小功能,这些小功能可能好多模块都会用到),但又不让这个小装饰(小功能)侵入到原有的模块中的代码里去.但是OO的Decorator简直就是一场恶梦,不信你就去看看wikipedia上的词条

理解 Python 装饰器看这一篇就够了

讲 Python 装饰器前,我想先举个例子,虽有点污,但跟装饰器这个话题很贴切. 每个人都有的内裤主要功能是用来遮羞,但是到了冬天它没法为我们防风御寒,咋办?我们想到的一个办法就是把内裤改造一下,让它变得更厚更长,这样一来,它不仅有遮羞功能,还能提供保暖,不过有个问题,这个内裤被我们改造成了长裤后,虽然还有遮羞功能,但本质上它不再是一条真正的内裤了.于是聪明的人们发明长裤,在不影响内裤的前提下,直接把长裤套在了内裤外面,这样内裤还是内裤,有了长裤后宝宝再也不冷了.装饰器就像我们这里说的长裤,在不

转发对python装饰器的理解

[Python] 对 Python 装饰器的理解的一些心得分享出来给大家参考 原文  http://blog.csdn.net/sxw3718401/article/details/39519587 主题 Python 最近写一个py脚本来整理电脑中的文档,其中需要检校输入的字符,为了不使代码冗长,想到使用装饰器. 上网搜索有关python的装饰器学习文档,主要看的是 AstralWind的一篇博文,以及Limodou的一篇文章.作为初学者,这两篇文章对新手有很大的帮助,但仍然有些不易理解的地方

Python装饰器的另类用法

之前有比较系统介绍过Python的装饰器,本文算是一个补充.今天我们一起探讨一下装饰器的另类用法. 语法回顾 开始之前我们再将Python装饰器的语法回顾一下. @decorate def f(...): pass 等同于: def f(...): pass f = decorate(f) @语法的好处在于: 相同的函数名只出现一次,避免了f = decorate(f)这样的语句. 可读性更高,让读代码的人一眼就明白函数被装饰了哪些功能. @call()装饰器 假设你要创建一个整数平方的列表,你

5.初识python装饰器 高阶函数+闭包+函数嵌套=装饰器

一.什么是装饰器? 实际上装饰器就是个函数,这个函数可以为其他函数提供附加的功能. 装饰器在给其他函数添加功能时,不会修改原函数的源代码,不会修改原函数的调用方式. 高阶函数+函数嵌套+闭包 = 装饰器 1.1什么是高阶函数? 1.1.1函数接收的参数,包涵一个函数名. 1.1.2 函数的返回值是一个函数名. 其实这两个条件都很好满足,下面就是一个高阶函数的例子. def test1(): print "hamasaki ayumi" def test2(func): return t

python装饰器通俗易懂的解释!

python装饰器 刚刚接触python的装饰器,简直懵逼了,直接不懂什么意思啊有木有,自己都忘了走了多少遍Debug,查了多少遍资料,猜有点点开始明白了.总结了一下解释得比较好的,通俗易懂的来说明一下: 小P闲来无事,随便翻看自己以前写的一些函数,忽然对一个最最最基础的函数起了兴趣: 1 def sum1(): 2 sum = 1 + 2 3 print(sum) 4 sum1() 此时小P想看看这个函数执行用了多长时间,所以写了几句代码插进去了: 1 import time 2 3 def

python装饰器1

第八步:让装饰器带 类 参数 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 # -*- coding:gbk -*- '''示例8: 装饰器带类参数''' class locker:     def __init__(self):         print("locker.__init__() should be not called.")   

Python装饰器由浅入深

装饰器的功能在很多语言中都有,名字也不尽相同,其实它体现的是一种设计模式,强调的是开放封闭原则,更多的用于后期功能升级而不是编写新的代码.装饰器不光能装饰函数,也能装饰其他的对象,比如类,但通常,我们以装饰函数为例子介绍其用法.要理解在Python中装饰器的原理,需要一步一步来.本文尽量描述得浅显易懂,从最基础的内容讲起. (注:以下使用Python3.5.1环境) 一.Python的函数相关基础 第一,必须强调的是python是从上往下顺序执行的,而且碰到函数的定义代码块是不会立即执行它的,只