[Grok-dev] Simple adapter question

Carsten Senger senger at rehfisch.de
Thu Mar 5 13:31:47 EST 2009


Hallo Jan,

Jan Ulrich Hasecke schrieb:
> -----BEGIN PGP SIGNED MESSAGE-----
> Hash: SHA1
> 
> Hi,
> 
> browsing the docs I have a question concerning adapters.
> 
> import grok
> from zope import interface
> 
> class Fireplace(grok.Model):
>     pass
> 
> class Cave(grok.Model):
>     pass
> 
> class IHome(interface.Interface):
>     pass
> 
> class Home(grok.MultiAdapter):
>     grok.adapts(Cave, Fireplace)
>     grok.implements(IHome)
> 
>     def __init__(self, cave, fireplace):
>         self.cave = cave
>         self.fireplace = fireplace
> 
> home = IHome(cave, fireplace)
> 
> Why is there an IHome in the last line? I would think that
> 
> home = Home(cave, fireplace)
> 
> would create a home-instance.

If there is only one adapter, there is no difference. Calling the 
interface is similar to getAdapter(). Zope gets the adapter and 
instantiates it.
The purpose of calling the interface instead of the implementation class 
is to let zope choose the right adapter. This way you can have 
specialized adapters if you have more special interfaces (class 
IFloorHeatedCave(Cave)), you can mark certain objects with a specialized 
interface and you can override an adapter registration with a better 
implementation in another packages. Zope will choose the most special 
adapter for you.

..Carsten



More information about the Grok-dev mailing list