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

可爱的 Python: Decorator 简化元编程

 2008-09-04 12:47:32 来源:WEB开发网   
核心提示: 清单 8. 健壮但却深度嵌套的 decoratordef arg_sayer(what):def what_sayer(meth):def new(self, *args, **kws):print whatreturn meth(self, *args, **kws)return new

清单 8. 健壮但却深度嵌套的 decorator

def arg_sayer(what):
  def what_sayer(meth):
    def new(self, *args, **kws):
      print what
      return meth(self, *args, **kws)
    return new
  return what_sayer
def FooMaker(word):
  class Foo(object):
    @arg_sayer(word)
    def say(self): pass
  return Foo()
foo1 = FooMaker('this')
foo2 = FooMaker('that')
print type(foo1),; foo1.say() # prints: <class '__main__.Foo'> this
print type(foo2),; foo2.say() # prints: <class '__main__.Foo'> that

@arg_sayer() 绕了很多弯路,但只获得非常有限的结果,不过对于它所阐明的几方面来说,这是值得的:

Foo.say() 方法对于不同的实例有不同的行为。在这个例子中,不同之处只是一个数据值,可以轻松地通过其他方式改变这个值;不过原则上来说,decorator 可以根据运行时的决策来彻底重写这个方法。

本例中未修饰的 Foo.say() 方法是一个简单的占位符,其整个行为都是由 decorator 决定的。然而,在其他情况下,decorator 可能会将未修饰的方法与一些新功能相结合。

正如我们已经看到的一样,Foo.say() 的修改是通过 FooMaker() 类工厂在运行时严格确定的。可能更加典型的情况是在顶级定义类中使用 decorator,这些类只依赖于编译时可用的条件(这通常就足够了)。

decorator 都是参数化的。或者更确切地说,arg_sayer() 本身根本就不是一个真正的 decorator;arg_sayer() 所返回的 函数 —— what_sayer() 就是一个使用了闭包来封装其数据的 decorator 函数。参数化的 decorator 较为常见,但是它们将所需的函数嵌套为三层。

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

Tags:可爱 Python Decorator

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