2.1.2.7 插件注册系统

这是一个不会修改类的类修饰器,但是,只要将它放在全局注册域。它会掉入返回原始对象的修饰器类别中:

In [21]:

  1. class WordProcessor(object):
  2. PLUGINS = []
  3. def process(self, text):
  4. for plugin in self.PLUGINS:
  5. text = plugin().cleanup(text)
  6. return text
  7. @classmethod
  8. def plugin(cls, plugin):
  9. cls.PLUGINS.append(plugin)
  10. @WordProcessor.plugin
  11. class CleanMdashesExtension(object):
  12. def cleanup(self, text):
  13. return text.replace('—', u'\N{em dash}')

这里我们用修饰器来分权插件注册。修饰器是名词而不是动词,因为我们用它来声明我们的类是WordProcessor的一个插件。方法plugin只是将类添加到插件列表中。

关于这个插件本身多说一句:它用实际的Unicode的em-dash字符替换了em-dash HTML实体。它利用unicode绝对标记来通过字符在unicode数据库(“EM DASH”)中的名字来插入字符。如果直接插入Unicode字符,将无法从程序源文件中区分en-dash。