在继承中,大多数时候我们想要创建从父级继承的子类,并且在实例化过程中,它们必须调用父构造函数。在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
方法,该方法是否正确地继承给子类?
答案 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'>