[Zope] Re: accessing object from a list constructed in __init__.py

Tres Seaver tseaver at palladion.com
Sun Jul 23 19:09:52 EDT 2006


-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1

kevin7kal wrote:
> That did not work for me either.
> It was also suggested that I try inheriting from folder rather than
> re-inventing folder.
> Still no dice.
> I think there is something that I don't understand about acquisition and
> context.  Why can an object be placed into context if it is stored as a
> simple attribute of another object, but not if it is an element in a
> list?  Or what must be done differently when the objects are elements in
> a list?

The piece of the picture you are missing is that the magic of
acquisition happens in the 'getattr' hook:  acquisition-aware objects
create the wrapper (via '__of__') for objects fetched from them via
attribute access.

Containers which want to provide the same semantics for 'getitem' access
have to call '__of__' directly themselves.  For objects derived from
OFS.ObjectManager, that responsibility is delegated to the '_getOb'
method.  Standard folders store their items as attributes, and so their
'_getOb' doesn't have to do anything special::

    def _getOb(self, id, default=_marker):
        if id[:1] != '_' and hasattr(aq_base(self), id):
            return getattr(self, id)
        if default is _marker:
            raise AttributeError, id
        return default

A BTreeFolder, however, does not store items as attributes;  its
'_getOb' looks like::

    def _getOb(self, id, default=_marker):
        """Return the named object from the folder.
        """
        tree = self._tree
        if default is _marker:
            ob = tree[id]
            return ob.__of__(self)
        else:
            ob = tree.get(id, _marker)
            if ob is _marker:
                return default
            else:
                return ob.__of__(self)


Tres.
- --
===================================================================
Tres Seaver          +1 202-558-7113          tseaver at palladion.com
Palladion Software   "Excellence by Design"    http://palladion.com
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.4.2.2 (GNU/Linux)
Comment: Using GnuPG with Mozilla - http://enigmail.mozdev.org

iD8DBQFExAHA+gerLs4ltQ4RAhl5AJwJkRws7ISOvGUt0XP3++opMp3H9ACgiCGQ
n41bgMeDpOE/VCI/EBJ/j3M=
=ZmGA
-----END PGP SIGNATURE-----



More information about the Zope mailing list