How to call child constructor from parent?

constructor, inheritance, oop, python

Solution

This can be done with:

Code:

class Parent(object):

    def clone(self):
        return type(self)(self._a)

Test Code:

class Parent(object):
    def __init__(self, ctype, a):
        print('This is the parent constructor')
        self._ctype = ctype
        self._a = a

    @property
    def a(self):
        return self._a

    @property
    def ctype(self):
        return self._ctype

    def clone(self):
        return type(self)(self._a)


class ChildOne(Parent):
    def __init__(self, a):
        super(ChildOne, self).__init__('one', a)
        print('This is the child One constructor')
        self.one = 1

class ChildTwo(Parent):
    def __init__(self, a):
        super(ChildTwo, self).__init__('two', a)
        print('This is the child Two constructor')
        self.two = 2

k = ChildOne(42)
print(k.ctype)
l = k.clone()
print(l.a)
print(type(l))

Results:

This is the parent constructor
This is the child One constructor
one
This is the parent constructor
This is the child One constructor
42
<class '__main__.ChildOne'>

Problem

In inheritance, most of the time we want to create child classes that inherit from the parent, and in the process of instantiation they have to call the parent constructor. In python we use `super` for this, and that's great. I want to do somewhat the opposite: I have a parent class which is a template for a number of child classes. Then I want the child classes to each have a function that allows an instance to clone itself: ``` class Parent(object): def __init__(self, ctype, a): print('This is the parent constructor') self._ctype = ctype self._a = a @property def a(self): return self._a @property def ctype(self): return self._ctype class ChildOne(Parent): def __init__(self, a): super(ChildOne, self).__init__('one', a) print('This is the child One constructor') self.one = 1 def clone(self): return ChildOne(self._a) class ChildTwo(Parent): def __init__(self, a): super(ChildTwo, self).__init__('two', a) print('This is the child Two constructor') self.two = 2 def clone(self): return ChildTwo(self._a) ``` Now, if I create an instance of one of the children, I can clone it: ``` >>> k = ChildOne(42) >>> k.ctype 'one' >>> l = k.clone() >>> l.a 42 >>> l is k False ``` The problem is, the `clone` method is repeated- and nearly identical- in both sub-classes, except I need to specify explicitly which constructor to call. Is it possible to design a `clone` method that I define in the parent class, that correctly inherits to the children?

Original source