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

可爱的 Python: Decorator 简化元编程

 2008-09-04 12:47:32 来源:WEB开发网   
核心提示: 迈进元类领域正如上一节中介绍的一样,decorator 并不能完全取代元类挂钩,可爱的 Python: Decorator 简化元编程(5),因为它们只修改了方法,而未添加或删除方法,这些新兴技术也许比 _metaclass_ 指派更加万能,例如,实际上,这样说并不完全正确

迈进元类领域

正如上一节中介绍的一样,decorator 并不能完全取代元类挂钩,因为它们只修改了方法,而未添加或删除方法。实际上,这样说并不完全正确。作为一个 Python 函数,decorator 完全可以实现其他 Python 代码所实现的任何功能。通过修饰一个类的 .__new__() 方法(甚至是其占位符版本),您实际上可以更改附加到该类的方法。尽管尚未在现实中看到这种模式,不过我认为它有着某种必然性,甚至可以作为 _metaclass_ 指派的一项改进:

清单 9. 添加和删除方法的 decorator

def flaz(self): return 'flaz'   # Silly utility method
def flam(self): return 'flam'   # Another silly method
def change_methods(new):
  "Warning: Only decorate the __new__() method with this decorator"
  if new.__name__ != '__new__':
    return new # Return an unchanged method
  def __new__(cls, *args, **kws):
    cls.flaz = flaz
    cls.flam = flam
    if hasattr(cls, 'say'): del cls.say
    return super(cls.__class__, cls).__new__(cls, *args, **kws)
  return __new__
class Foo(object):
  @change_methods
  def __new__(): pass
  def say(self): print "Hi me:", self
foo = Foo()
print foo.flaz() # prints: flaz
foo.say()     # AttributeError: 'Foo' object has no attribute 'say'

在 change_methods() decorator 示例中,我们添加并删除了几个固定的方法,不过这是毫无意义的。在更现实的情况中,应使用上一节中提到的几个模式。例如,参数化的 decorator 可以接受一个能表示要添加或删除的方法的数据结构;或者由数据库查询之类的某些环境特性做出这一决策。这种对附加方法的操作也可以像之前一样打包到一个函数工厂中,这将使最终决策延迟到运行时。这些新兴技术也许比 _metaclass_ 指派更加万能。例如,您可以调用一个增强了的 change_methods(),如下所示:

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

Tags:可爱 Python Decorator

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