如何从父级调用子构造函数?

时间:2017-05-01 04:28:18

标签: python oop inheritance constructor

在继承中,大多数时候我们想要创建从父级继承的子类,并且在实例化过程中,它们必须调用父构造函数。在python中,我们使用super来表示这一点,这很棒。

我想做一些相反的事情:我有一个父类,它是许多子类的模板。然后我希望每个子类都有一个允许实例克隆自身的函数:

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)

现在,如果我创建其中一个孩子的实例,我可以克隆它:

>>> k = ChildOne(42)
>>> k.ctype
'one'
>>> l = k.clone()
>>> l.a
42
>>> l is k
False

问题是,clone方法在两个子类中重复 - 几乎相同 - 除了我需要明确指定要调用的构造函数。是否可以设计我在父类中定义的clone方法,该方法是否正确地继承给子类?

1 个答案:

答案 0 :(得分:2)

这可以通过以下方式完成:

<强>代码:

class Parent(object):

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

测试代码:

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))

<强>结果:

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'>