Inheriting from instance in Python

inheritance, instance, overloading, python

Solution

I find this (encapsulation) to be the cleanest way:

class Child(object):
    def __init__(self):
        self.obj = Parent()

    def __getattr__(self, attr):
        return getattr(self.obj, attr)

This way you can use all Parent's method and your own without running into the problems of inheritance.

Problem

In Python, I would like to construct an instance of the Child's class directly from an instance of the Parent class. For example: ``` A = Parent(x, y, z) B = Child(A) ``` This is a hack that I thought might work: ``` class Parent(object): def __init__(self, x, y, z): print "INITILIZING PARENT" self.x = x self.y = y self.z = z class Child(Parent): def __new__(cls, *args, **kwds): print "NEW'ING CHILD" if len(args) == 1 and str(type(args[0])) == "<class '__main__.Parent'>": new_args = [] new_args.extend([args[0].x, args[0].y, args[0].z]) print "HIJACKING" return Child(*new_args) print "RETURNING FROM NEW IN CHILD" return object.__new__(cls, *args, **kwds) ``` But when I run ``` B = Child(A) ``` I get: ``` NEW'ING CHILD HIJACKING NEW'ING CHILD RETURNING FROM NEW IN CHILD INITILIZING PARENT Traceback (most recent call last): File "classes.py", line 52, in <module> B = Child(A) TypeError: __init__() takes exactly 4 arguments (2 given) ``` It seems the hack works just as I expected but the compiler throws a TypeError at the end. I was wondering if I could overload TypeError to make it ignore the B = Child(A) idiom but I wasn't sure how to do that. In any case, would you please give me your solutions for inheriting from instances? Thanks!

Original source

Related problems