标签:
再看了很多装饰器代码解释之后,懵懂的我,突然顿悟。主要参考
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”,只是为了更清楚,这不部分,无论写成什么,都不会起作用。
所以,请记住,装饰器的三大组成,扮相,假演员,真演员。 扮相必须带参数,用来接收假演员返回。真假演员必须佩带相同的参数。
还是挺高兴的。编程时候记住三个词,扮相、假演员、真演员。其他的就随手拈来。理解了精髓,可以看别人代码,慢慢学习。
附上 阿庆嫂 扮相一张,振奋一下昏昏欲睡的下午精神
标签:
原文地址:http://www.cnblogs.com/gjwork/p/4432489.html