Python继承中关键字super的实际用途是什么?

时间:2015-04-02 09:42:00

标签: python django

我理解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

1 个答案:

答案 0 :(得分:3)

  

我有点理解......

你有两次尝试,既不正确:

  • "将同时调用父类的方法和子类的方法" - 不,它会调用下一个类中的方法MRO(方法解决顺序);和
  • "当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我们必须在两个地方进行修改。