Chinaunix首页 | 论坛 | 博客
  • 博客访问: 5096330
  • 博文数量: 921
  • 博客积分: 16037
  • 博客等级: 上将
  • 技术积分: 8469
  • 用 户 组: 普通用户
  • 注册时间: 2006-04-05 02:08
文章分类

全部博文(921)

文章存档

2020年(1)

2019年(3)

2018年(3)

2017年(6)

2016年(47)

2015年(72)

2014年(25)

2013年(72)

2012年(125)

2011年(182)

2010年(42)

2009年(14)

2008年(85)

2007年(89)

2006年(155)

分类: Python/Ruby

2013-12-19 11:23:57


  1. #! /usr/bin/env python
  2. #coding=utf-8

  3. ###工具:可以对应设计模式中的单子模式

  4. ##1序言
  5. #现在我们已经了解了接口、适配器以及组件注册表的概念。
  6. #有时注册一个并不适配任何东西的对象也是有用的。
  7. #比如数据库连接、XML解析器、返回唯一Id的对象等等,就属于这种情况。
  8. #ZCA提供的这类组件称为 工具 (utility)组件。

  9. #工具只是一种提供了接口的对象,并且能够使用接口和名字来查询。
  10. #这一过程创建了一个全局注册表,用这个注册表可以注册实例并且随后被应用程序的其他部分访问,
  11. #也就不必再把这些实例作为参数到处传递了。

  12. #我们不必用这种方法来注册所有的组件实例,通常只注册需要进行替换的组件就可以了。

  13. ##2 简单工具
  14. #注册一个工具时可以带名字也可以不带名字。带名字注册的工具称为命名工具,这将在下一节讲到。
  15. #在实现工具之前,和以前一样,得先定义一个接口。下面是一个 接待员 (greeter)接口:

  16. from zope.interface import Interface, implementer
  17. from zope.interface import implements

  18. class IGreeter(Interface):
  19.     def greet(name):
  20.         """Say hello"""

  21. #和适配器一样,一个工具可能有多个的实现。这是上面接口的一个可能实现:
  22. @implementer(IGreeter)
  23. class Greeter(object):
  24.     #implements(IGreeter)
  25.     def greet(self, name):
  26.         return "Hello " + name
  27.     
  28. #实际工具将是这个类的一个实例。
  29. #为使用这个工具,必须注册它,然后可以用ZCA的API来进行查询。
  30. #我们可以用 registerUtility 来注册这个类的实例(也就是注册了一个工具 ):

  31. from zope.component import getGlobalSiteManager
  32. gsm = getGlobalSiteManager()
  33. greet = Greeter()
  34. gsm.registerUtility(greet, IGreeter)

  35. #在这个例子里,我们将工具注册为 IGreeter 接口的一个提供者。
  36. #(也就是一个实现此接口的实例对象)
  37. #我们可以用 queryUtility 或 getUtility 来查询接口:
  38.     
  39. from zope.component import queryUtility
  40. from zope.component import getUtility

  41. print queryUtility(IGreeter).greet('Jack')
  42. print getUtility(IGreeter).greet('Jack')

  43. #适配器通常是类,而工具通常是类的实例。
  44. #工具类的实例只需创建一次,但适配器的实例可以在任何我们查询它的时候动态创建。

  45. ##3 命名工具
  46. #类似适配器,我们在注册一个工具组件的时候可以提供名字。
  47. #如上一节提到的那样,使用一个特定名字注册的组件被称为命名工具。
  48. #这是如何带名字注册 greeter 工具的一个例子:
  49.     
  50. greet = Greeter()
  51. gsm.registerUtility(greet, IGreeter, 'new')

  52. #我们带着名字将工具注册为 IGreeter 接口的一个提供者,
  53. #然后就可以用 queryUtility 或 getUtility 来查询接口:

  54. print queryUtility(IGreeter, 'new').greet('Jill')
  55. print getUtility(IGreeter, 'new').greet('Jill')

  56. #在查询时我们必须把`名字`作为第二个参数来提供。
  57. #不带名字调用 getUtility 函数与以空字符串作为名字来调用是等价的。
  58. #因为第二个参数(keyword)的默认值就是一个空字符串。
  59. #然后组件查询机制将试着寻找以空字符串作为名字的组件,并且会失败。
  60. #当组件查询失败时,会抛出 ComponentLookupError 异常。
  61. #注意,这不会随机返回使用其他名字注册的组件。
  62. #适配器查询函数 getAdapter 和 queryAdapter 也是按照类似方式工作的。



  1. #! /usr/bin/env python
  2. #coding=utf-8


  3. ##*** 4 工厂

  4. ##工厂是提供 IFactory 接口的工具组件。
  5. ##为创建工厂,首先定义对象的接口:
  6. from zope.interface import Attribute
  7. from zope.interface import Interface
  8. from zope.interface import implements

  9. class IDatabase(Interface):
  10.     def getConnection():
  11.         """Return connection object"""
  12.         
  13. ##这是IDatabase接口的一个伪实现:
  14. @implementer(IDatabase)
  15. class FakeDb(object):
  16. # implements(IDatabase)
  17.     def getConnection(self):
  18.         return "connection"

  19. @implementer(IDatabase)
  20. class FakeDb2(object):
  21. # implements(IDatabase)
  22.     def getConnection(self):
  23.         return "connection222"

  24. ##我们可以用 zope.component.factory.Factory 创建一个工厂:
  25. from zope.component.factory import Factory

  26. factory = Factory(FakeDb, 'FakeDb')

  27. print "factory", factory
  28. F2 = Factory(FakeDb2, "FakeDb2")

  29. #注册
  30. from zope.component import getGlobalSiteManager
  31. gsm = getGlobalSiteManager()

  32. from zope.component.interfaces import IFactory
  33. gsm.registerUtility(factory, IFactory, 'fakedb')

  34. gsm.registerUtility(F2, IFactory, 'FakeDb2')

  35. #要使用工厂,我们可能会这样做:
  36. from zope.component import queryUtility
  37. print queryUtility(IFactory, 'fakedb')() #doctest: +ELLIPSIS
  38.     
  39. from zope.component import createObject
  40. print createObject('FakeDb2') #doctest: +ELLIPSIS

  41. print queryUtility(IFactory, 'fakedb')().getConnection()
  42. print queryUtility(IFactory, 'FakeDb2')().getConnection()

  43. print "F2", F2
  44. print ""




阅读(1651) | 评论(0) | 转发(0) |
0

上一篇:1.zope 适配器

下一篇:3.zope:多适配器

给主人留下些什么吧!~~