[ZPatterns] what I'm doing wrong? PlugIns bug?

Juan David Ibáñez Palomar palomar@sg.uji.es
Thu, 25 Oct 2001 18:27:06 +0200


Antonio Beamud Montero wrote:

> On Thu, 2001-10-25 at 15:02, Steve Alexander wrote:
> 
>>Antonio Beamud Montero wrote:
>>
>>
>>>Eureka!!! Al works ok... yepppa, and now my question, why I need to wrap
>>>again this objects? 
>>>
>>
>>You shouldn't store wrapped objects. I think the ZODB will strip them 
>>for you if you do try to store them.
>>
> 
> Then, how can I store references to another objects? Perhaps I have a
> bad design of my systems...
> 


Perhaps. Try this:


from ExtensionClass import Base
from Acquisition import Implicit

class A(Base):
     def __init__(self, ob):
         self.map = {'ob': ob}
         self.ob = ob


class B(Base, Implicit):
     pass


a = A(B())

print a.ob is a.map['ob']


When this code is executed it returns 0, "a.ob" and "a.map['ob']"
are different, the first one is an acqusition wrapper, the last
one is not. The __of__ method of the B instance (defined in
Implicit) is only called when the object is accesed as a subobject
of "a", then it returns the acq. wrapper.

That is, you have two options:

  - Access always to your instances through "self":

      def list(self):
          return [ getattr(self, x) for x in self._cons.keys() ]

    This solution only works if you store your objects in "_cons"
    and as attributes of "self".

  - Explicitly wrapp them (but don't store the wrapped object, as
    Steve explained):

      def list(self):
          return [ x.__of__(self) for x in self._cons.values() ]


Ummhh.. it seems the problem has nothing to do with PlugIns, so it's
becoming offtopic for this mailing list.


jdavid