【发布时间】:2015-06-07 05:14:06
【问题描述】:
我有点理解,ChildClass 中继承自 BaseClass 的关键字 super 是为了防止在 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
【问题讨论】:
-
super()不调用任何东西;您仍然必须显式调用父方法。它使您可以访问父类上的方法的实现,因此您可以根据需要重用该实现。 -
我不完全清楚你的问题是什么。如果
ChildClass.save()必须进行一些额外的处理,但您不想复制所有工作BaseClass.save()会怎样?这就是super()的用武之地,您可以重用原始的save()方法,而无需再次执行所有这些工作,但您可以添加到原始行为的同时向ChildClass的用户提供一致的 API。 -
我认为您要问的是调用父方法的用途,但您可能完全是在问其他问题。
-
想象
BaseClass.save()可以存储一些文档,但不会通知用户有关保存状态的信息。因此,您可以extend BaseClass并调用super.save(...)(保存文档)然后通知用户保存状态...为什么要使用super前缀调用?由于您的子方法完全按照父 (.save(...)) 调用,您需要告诉编译器调用父保存。如果你不这样做,它会无限调用自己并抛出错误......