我理解super
中继承自ChildClass
的关键字BaseClass
是为了防止在ChildClass
拥有时覆盖基类的方法同样的方法。这有什么实际用途?
例如:
class BaseClass():
def save(*args, **kwargs):
print "save from BaseClass"
class ChildClass(BaseClass):
def save(self, *args, **kwargs):
super(ChildClass, self).save(*args, **kwargs)
print "save from ChildClass"
someObject = ChildClass()
someObject.save()
输出:
save from BaseClass
save from ChildClass
答案 0 :(得分:3)
我有点理解......
你有两次尝试,既不正确:
ChildClass
具有相同的方法时,阻止覆盖基类的方法" - 否,子类实现 覆盖基类,super
允许您在不明确指定类的情况下访问继承的实现。这有什么实际用途?
最简单的,假设我们有一个带有一个初始化参数的基类:
def Base(object):
def __init__(self, attr1):
self.attr1 = attr1
和一个有两个孩子的班级。然后我们可以用两种方法之一实现子节点,或者不调用基类:
def Child(Base):
def __init__(self, attr1, attr2):
self.attr1 = attr1
self.attr2 = attr2
或通过调用基类:
def Child(Base):
def __init__(self, attr1, attr2):
super(Child, self).__init__(attr1)
self.attr2 = attr2
请注意,这会减少重复次数,如果我们更改attr1
类中Base
的处理(例如,我们将参数分配给" private"属性{{1}并通过_attr1
访问它,我们只需要进行一次更改。
您还可以将第二个实现为:
@property
但这又意味着重复 - 我们现在必须在def __init__(self, attr1, attr2):
Base.__init__(self, attr1)
self.attr2 = attr2
的两个位置指定名称Base
,因此如果我们重命名Child
或更改继承Base
我们必须在两个地方进行修改。