Welcome, guest | Sign In | My Account | Store | Cart
# helper descriptor
class _descr(object):
    objrefs
= {}
    clsrefs
= {}
   
def __init__(self,name):
       
self.name = name
   
def __get__(self,instance,owner):
       
if instance is None:
           
return getattr(_descr.clsrefs[id(owner)],self.name)
       
else:
           
return getattr(_descr.objrefs[id(instance)],self.name)
   
def __set__(self,instance,value):
        setattr
(_descr.objrefs[id(instance)],self.name,value)

# main function
def immerse(source_obj,dest_obj):
    dest_cls
= dest_obj.__class__
    _descr
.objrefs[id(dest_obj)]=source_obj
    _descr
.clsrefs[id(dest_cls)]=source_obj.__class__
   
for name in dir(source_obj):
       
if not hasattr(dest_obj,name):
            setattr
(dest_cls,name,_descr(name))

### TEST ###

# class whose instance will be immersed in B instances
class A:
    x1
= "A.x1"
    y1
= "A.y1"
   
def __init__(self):
       
self.x2 = "x2 of %s"%self
       
self.y2 = "y2 of %s"%self

   
def foo1(self,z):
       
print "A.foo1(%s,%s)"%(self,z)

   
def foo2(self,z):
       
print "A.foo2(%s,%s)"%(self,z)

   
def __getitem__(self,value):
       
print "A.__getitem__(%s,%s)"%(self,value)
       
return value

# main class
class B(object):
    x1
= "B.x1"
   
def __init__(self):
       
self.y2 = "y2 of %s"%self

       
self.a = A() # instance to be immersed
        immerse
(self.a,self) # immersion

   
def foo1(self,z):
       
print "B.foo1(%s,%s)"%(self,z)

b
=B()

print "b.x1="+b.x1
print "b.x2="+b.x2
print "b.y1="+b.y1
print "b.y2="+b.y2

print "executing b.foo1(10)..."
b
.foo1(10)
print "executing b.foo2(20)..."
b
.foo2(20)
print "executing b['hi all']..."
b
["hi all"]

# output:
# b.x1=B.x1
# b.x2=x2 of <__main__.A instance at 0x00B85828>
# b.y1=A.y1
# b.y2=y2 of <__main__.B object at 0x00B83A50>
# executing b.foo1(10)...
# B.foo1(<__main__.B object at 0x00B83A50>,10)
# executing b.foo2(20)...
# A.foo2(<__main__.A instance at 0x00B85828>,20)
# executing b['hi all']...
# A.__getitem__(<__main__.A instance at 0x00B85828>,hi all)

History