Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to call child constructor from parent?

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?

like image 891
Brandon Kuczenski Avatar asked Oct 19 '25 05:10

Brandon Kuczenski


1 Answers

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'>
like image 65
Stephen Rauch Avatar answered Oct 20 '25 18:10

Stephen Rauch



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!