overriding method that returns base class object

Paul Rubin http
Tue Feb 17 04:16:36 CET 2004

"Stuart McGraw" <smcg4191 at frii.RemoveThisToReply.com> writes:
> Class A has a method A.a() that returns an A.  I want a 
> identical class but with an additional property .newprop
> and method .b()  And I want .a() to return a B, not an A.
>   class B (A):
>     def __init__(self, *args, **kwds):
>       A.__init__(self, *args, **kwds)
>       self.newprop = 99
>     def a(self):
>       x = A.a(self)    # x is an A
>       x.__class__ = B
>       return x    # I want x to be a B, i.e have b() and .newprop.


> Yes, I know this is bogus.  But I am not sure what I should be doing.

I think you have to make B into a container for an A.  Something like:

class B(A):
     def __init__(self, *args, **kwds):
       self.newprop = 99
       self.wrapped_A = A(*args, **kwds)
     def a(self):
       x = B()
       x.wrapped_A = A.a(self.wrapped_A)
       return     # I want x to be a B, i.e have b() and .newprop.
     def __getattr__(self, attr):
       # delegate all inherited operations to the wrapped A object
       return A.__getattr__(self.wrapped_A, attr)

You might also be able to do something crazy, like change A's metaclass
so that its __new__ operation can make a B under certain circumstances.

More information about the Python-list mailing list