码迷,mamicode.com
首页 > 编程语言 > 详细

关于python装饰器的理解

时间:2015-04-16 17:18:07      阅读:157      评论:0      收藏:0      [点我收藏+]

标签:

再看了很多装饰器代码解释之后,懵懂的我,突然顿悟。主要参考

http://pythonmap.iteye.com/blog/1682696

http://www.cnblogs.com/rhcad/archive/2011/12/21/2295507.html

其实这两个参考开始都看不下去。完全不懂呀。折磨时候,实验代码,随便折腾,竟然让我顿悟了。抓到精髓了,再看就简单了。还有个问题没有解决,就是装饰器的用处。主要参考http://www.cnblogs.com/rollenholt/archive/2012/05/02/2479833.html 没理解下去。回头再看。

装饰器精髓:扮相,假演员,真演员。     扮相必须携带参数,用来接收假演员,真假演员必须携带同样的参数。

某戏台要找出演《智斗》,演员要化妆成阿庆嫂的模样,那么就需要一个是准备阿庆嫂的扮相,另一个是找演员。装饰器的精髓就是这个。

>>> def a(m):    #这个a就是阿庆嫂的扮相
...   print "hello"    #迷惑敌人
...   def b():          #假设演员是 b 
...     return "A Qing Sao"#这个是演员在这部戏里面需要做的事情
...   print "world"    #迷惑敌人
...   return b          #这个 b 就是演员,把 b 塞到 a 的扮相下
... 

#上面就定义好了阿庆嫂的扮相和演员要做的事情

>>> @a      #这个表示下面出场的是阿庆嫂
... def zhidou():  #出演的演员名字是zhidou()
...   print "Diao De Yi"   #迷惑敌人
...   return "Sha Jia Bang"   #迷惑敌人
... 
hello     #迷惑敌人
world    #迷惑敌人

>>> zhidou()    #大幕拉开,演员zhidou已经化好妆上台,开始表演了
A Qing Sao‘     #看到了吧,输出只有规定好的动作,其他的都是浮云。


分析上面的代码,其中“迷惑敌人”的部分不用理,剩下的精髓就是阿庆嫂的扮相 a 和假定的演员 b 以及最后出演的真实的演员 zhidou 这三个部分。

其中扮相 a 必须携带一个参数,而且只能携带一个参数,这个参数是用来接收最后假定的演员 b ,在扮相 a 的面具下塞入 b。

还要有一个真实演员 zhidou,这就行了。简化代码。 而真正演员要做的事情,就是b里面规定的内容,其他地方无论是什么都是在开演前迷惑观众,宣传造势用的。

真正开演了,就做一件事情,就是b里面规定的事情。

def a(m):   #阿庆嫂扮相

     def b(): pass   #演员要做的事情

     return b    #把 b 塞到 阿庆嫂的扮相下

@a              #按照 a 的标准打扮的说明文字

def zhidou(): pass   #真演员开始化妆

zhidou()   #真演员开演

 

上面举例是演员 b 不带参数的,那么真演员 zhidou 也要不带参数。

如果 b 带着参数,那么 zhidou 也要带相同的参数

这样才可以演嘛。

但是无论怎么变, 扮相 a 里面只能带一个参数,而且只能带一个,返回值,也必须是这个假演员。

那么这个装饰器的作用是什么呢? 目前看是可以按不同扮相打扮真演员。

比如

@a

@A

def zhidou():pass

也就是同时有几个扮相打扮真演员。

具体打扮成什么样就看实际应用了。这里只是一个理解。

下面是带参的模样。迷惑部分就不写了,只写有用部分。可以带几个参数,现在设置只带一个参数。还可以b(x,y)等等。

def a(m):

  def b(x): return x+x

  return b

@a

def zhidou(y): return "hello"

 zhidou(3)  #运行结果就是一个6,没有输出任何“hello”。 这里又加了一个迷惑部分“hello”,只是为了更清楚,这不部分,无论写成什么,都不会起作用。

所以,请记住,装饰器的三大组成,扮相,假演员,真演员。 扮相必须带参数,用来接收假演员返回。真假演员必须佩带相同的参数。

还是挺高兴的。编程时候记住三个词,扮相、假演员、真演员。其他的就随手拈来。理解了精髓,可以看别人代码,慢慢学习。

附上 阿庆嫂 扮相一张,振奋一下昏昏欲睡的下午精神

技术分享

关于python装饰器的理解

标签:

原文地址:http://www.cnblogs.com/gjwork/p/4432489.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!