Re: [Zope-dev] Beyond Acquisition

2002-04-19 Thread Toby Dickenson

On Fri, 19 Apr 2002 15:28:52 + (UTC), [EMAIL PROTECTED] ()
wrote:

It seems there is no way to get the real 'b' attribute from a, i.e. the
B instance set at the line a.b = B()

Thats exactly right. your __of__ method means that *any* time you try
to take a B object out of an A, you get a C object instead of a B. 

try a.__dict__['b']



Toby Dickenson
[EMAIL PROTECTED]


___
Zope-Dev maillist  -  [EMAIL PROTECTED]
http://lists.zope.org/mailman/listinfo/zope-dev
**  No cross posts or HTML encoding!  **
(Related lists -
 http://lists.zope.org/mailman/listinfo/zope-announce
 http://lists.zope.org/mailman/listinfo/zope )



Re: [Zope-dev] Beyond Acquisition

2002-04-19 Thread

In article [EMAIL PROTECTED],
Toby Dickenson  [EMAIL PROTECTED] wrote:
On Fri, 19 Apr 2002 15:28:52 + (UTC), [EMAIL PROTECTED] ()
wrote:

It seems there is no way to get the real 'b' attribute from a, i.e. the
B instance set at the line a.b = B()

Thats exactly right. your __of__ method means that *any* time you try
to take a B object out of an A, you get a C object instead of a B. 

try a.__dict__['b']

That's not a good solution since the b attribute can be defined in the
classes of a...

With some tries, I think I got the solution:

_nodefault = []

def getrealattr(obj, name, default = _nodefault):
try:
return obj.__dict__[name]
except KeyError: pass
objclass = obj.__class__
try:
attr = getattr(objclass, name)
if hasattr(attr, '__of__'):
# a trick from extension class:
# whenever you get a class attribute,
# you will get a Python Method
# im_func get the function if it is a
# method and the real object if not
return attr.im_func
return attr
except AttributeError:
if default is _nodefault: raise
return default

if __name__ == '__main__':
# Tests
from Acquisition import Implicit
class C(Implicit):
def __init__(self, name):
self.name = name

class B(C):
def __of__(self, parent):
return C(self.name + ' (in object %s)' % parent.name).__of__(parent)

class A(C):
b = B('b in the class')

a = C('a')
b = B('b')
a.b = b
print 'a.b = %s' % a.b.name
print 'real a.b = %s' % getrealattr(a, 'b').name

a = A('a')
print 'a.b = %s' % a.b.name
print 'real a.b = %s' % getrealattr(a, 'b').name

print getrealattr(a, 'c', None)

-- 
Julien Jalon
http://www.nuxeo.com/


___
Zope-Dev maillist  -  [EMAIL PROTECTED]
http://lists.zope.org/mailman/listinfo/zope-dev
**  No cross posts or HTML encoding!  **
(Related lists - 
 http://lists.zope.org/mailman/listinfo/zope-announce
 http://lists.zope.org/mailman/listinfo/zope )