ITS·黑客

Python学习笔记十一-装饰器2

2017-04-22  本文已影响19人  6156fc232124

为了进一步明确装饰器的用法,结合我找的笔记,记录一个手工装饰器的例子,通过这个例子很容易理解装饰器的原理,并运用它。

# 装饰器是一个函数,而其参数为另外一个函数

def my_shiny_new_decorator(a_function_to_decorate) :

# 在内部定义了另外一个函数:一个封装器。

# 这个函数将原始函数进行封装,所以你可以在它之前或者之后执行一些代码

def the_wrapper_around_the_original_function() :

# 放一些你希望在真正函数执行前的一些代码

print "Before the function runs"

# 执行原始函数

a_function_to_decorate()

# 放一些你希望在原始函数执行后的一些代码

print "After the function runs"

#在此刻,"a_function_to_decrorate"还没有被执行,我们返回了创建的封装函数

#封装器包含了函数以及其前后执行的代码,其已经准备完毕

return the_wrapper_around_the_original_function

# 现在想象下,你创建了一个你永远也不远再次接触的函数

def a_stand_alone_function() :

print "I am a stand alone function, don't you dare modify me"

a_stand_alone_function()

#输出: I am a stand alone function, don't you dare modify me

# 好了,你可以封装它实现行为的扩展。可以简单的把它丢给装饰器

# 装饰器将动态地把它和你要的代码封装起来,并且返回一个新的可用的函数。

a_stand_alone_function_decorated = my_shiny_new_decorator(a_stand_alone_function)

a_stand_alone_function_decorated()

#输出 :

#Before the function runs

#I am a stand alone function, don't you dare modify me

#After the function runs

现在你也许要求当每次调用a_stand_alone_function时,实际调用却是a_stand_alone_function_decorated。实现也很简单,可以用my_shiny_new_decorator来给a_stand_alone_function重新赋值。

a_stand_alone_function = my_shiny_new_decorator(a_stand_alone_function)

a_stand_alone_function()

#输出 :

#Before the function runs

#I am a stand alone function, don't you dare modify me

#After the function runs

# And guess what, that's EXACTLY what decorators do !

这个时候,你是不是明白装饰器的用法了,但是!!!!如果你以为这样就结束了,那么可能你需要检讨一下自己是否学会装饰器,必要时候可以发个红包反省一下。

为什么呢?因为这里还没有用装饰器的语法@呀!!!!

那把例子改成装饰器的语法,是什么样子呢?

@my_shiny_new_decorator

def another_stand_alone_function() :

print "Leave me alone"

another_stand_alone_function()

#输出 :

#Before the function runs

#Leave me alone

#After the function runs

如果上面的搞懂了,那就一定明白装饰器了,那机智的我们再来升级一下!!!来一个“复合函数”试一下!!!

def bread(func) :

def wrapper() :

print ""

func()

print "<\______/>"

return wrapper

def ingredients(func) :

def wrapper() :

print "#tomatoes#"

func()

print "~salad~"

return wrapper

def sandwich(food="--ham--") :

print food

sandwich()

#输出 : --ham--

sandwich = bread(ingredients(sandwich))

sandwich()

#outputs :

#

# #tomatoes#

# --ham--

# ~salad~

#<\______/>

使用python装饰器语法:

@bread

@ingredients

def sandwich(food="--ham--") :

print food

sandwich()

#输出 :

#

# #tomatoes#

# --ham--

# ~salad~

#<\______/>

一定要注意@的前后顺序,其实就是“符合函数”谁在括号内谁在括号外。

前面只要掌握了,装饰器就没什么问题,后面的装饰器分类和应用只要看廖雪峰老师的教程就可以理解了,这里就不再赘述了。大家看了都懂了的,并且我学习起来没问题就不赘述了吧哈哈哈哈哈哈。

上一篇下一篇

猜你喜欢

热点阅读