[Zope-dev] im_self of methods accessed via non trivial
acquisition
Phillip J. Eby
pje@telecommunity.com
Fri, 18 Jan 2002 06:24:13 -0500
At 09:42 AM 1/18/02 +0100, Stefan Bund wrote:
>A--O--[a]
>| |
>| [b]
>|
>O--B--O--[c]
>| | |
>| | [d]
>| |
>| O--[e]
>| |
>| [f]
>|
>[g]
>
>...
>
>let /m/ be a method of the objekt /f/. The expression of interest is
>
> x := A.m
>
>I would expect /x.im_self/ to be an acquisition wrapper C
>
> C := A.f
>
>where (as far as i understand the rules of acquisition)
>/C.aq_parent == A/
>
>But instead displaying /x.im_self/ yields the acquisition tree rooted
>at /B/ !!
>
>I find this a bit disturbing. My question: 'Is it a *bug* or a
>*feature*?'. I hope, I made my point clear.
Method rebinding is done only when an item is retrieved from the aq_self
side, and only if im_self points to aq_self. If these conditions are met,
a new binding is created which points to the acquisition wrapper.
This is a feature, not a bug. If you rebind im_self on the aq_parent side,
and your method assigns a value to an attribute of self, it will be
assigned to the wrong object! It is safe in your example to bind m.im_self
to B, because B.aq_base is f, the true self of m. But it is not safe to
bind m.im_self to A, because A.aq_base is g -- another object altogether.
I guess another way to look at it is that a method retrieved from an
acquisition-wrapped object will always meet the condition that
method.im_self.aq_base is the original object the method was retrieved
from. This ensures that the method simply works with an
acquisition-wrapped version of its original self.