"Peter Otten" <[EMAIL PROTECTED]> wrote in message news:[EMAIL PROTECTED] > Frederic Rentsch wrote: > >> If I derive a class from another one because I need a few extra >> features, is there a way to promote the base class to the derived one >> without having to make copies of all attributes? >> >> class Derived (Base): >> def __init__ (self, base_object): >> # ( copy all attributes ) >> ... >> >> This looks expensive. Moreover __init__ () may not be available if it >> needs to to something else. > > base_instance = Base(...) > base_instance.__class__ = Derived > > Peter
This will change the class-level behavior of the object, but it wont automagically populate the instance with any attributes that are specifically added in Derived's __init__. class A(object): def __init__(self,x): self.x = x def method(self): print "I am an A whose x value is", self.x class B(A): bb = 1000 def __init__(self,x,y): super(B,self).__init__(x) self.y = y def method(self): print "I am a B whose x value is", self.x aobj = A(100) aobj.method() aobj.__class__ = B aobj.method() print aobj.bb print aobj.y prints: I am an A whose x value is 100 I am a B whose x value is 100 1000 Traceback (most recent call last): File "dertest.py", line 20, in ? print aobj.y AttributeError: 'B' object has no attribute 'y' But it wouldn't be hard to write a makeBaseIntoDerived method: def makeAintoB(a,y=0): a.y = y a.__class__ = B -- Paul -- http://mail.python.org/mailman/listinfo/python-list