WEB开发网
开发学院软件开发Python 可爱的 Python: Decorator 简化元编程 阅读

可爱的 Python: Decorator 简化元编程

 2008-09-04 12:47:32 来源:WEB开发网   
核心提示: decorator 可能会返回一个函数,但这个函数与未修饰的函数之间不存在有意义的关联:清单 6. 忽略传入函数的 decorator>>> def spamrun(fn):... def sayspam(*args):... print "spam, spam

decorator 可能会返回一个函数,但这个函数与未修饰的函数之间不存在有意义的关联:

清单 6. 忽略传入函数的 decorator

>>> def spamrun(fn):
...   def sayspam(*args):
...     print "spam, spam, spam"
...   return sayspam
...
>>> @spamrun
... def useful(a, b):
...   print a**2 + b**2
...
>>> useful(3,4)
spam, spam, spam

最后,一个表现更良好的 decorator 可以在某些方面增强或修改未修饰函数的操作:

清单 7. 修改未修饰函数行为的 decorator

>>> def addspam(fn):
...   def new(*args):
...     print "spam, spam, spam"
...     return fn(*args)
...   return new
...
>>> @addspam
... def useful(a, b):
...   print a**2 + b**2
...
>>> useful(3,4)
spam, spam, spam
25

您可能会质疑,useful() 到底有多么有用?addspam() 真的是那样出色的增强 吗?但这种机制至少符合您通常能在有用的 decorator 中看到的那种模式。

高级抽象简介

根据我的经验,元类应用最多的场合就是在类实例化之后对类中的方法进行修改。decorator 目前并不允许您修改类实例化本身,但是它们可以修改依附于类的方法。这并不能让您在实例化过程中动态添加或删除方法或类属性,但是它让这些方法可以在运行时根据环境的条件来变更其行为。现在从技术上来说,decorator 是在运行 class 语句时应用的,对于顶级类来说,它更接近于 “编译时” 而非 “运行时”。但是安排 decorator 的运行时决策与创建类工厂一样简单。例如:

上一页  1 2 3 4 5 6 7 8  下一页

Tags:可爱 Python Decorator

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接