我在处理数据库时已经注意到了一些事情,特别是处理数据库的python ORM。
以下是django中save()
函数的示例:
def save(self, **kwargs):
self.somevar = dosomething(self.someothervar)
return super(<Your_Model_Here>, self).save()
此外,在谷歌应用引擎中,使用函数put()
:
def put(self, **kwargs):
self.<some_var> = doSomething(self.someOtherVar)
return super(<Entity>, self).save()
现在,我理解为什么我们这样做,IIRC,我们这样做是因为我们没有手动编写put()
或save()
函数,所以我们需要使用super调用来正常运行
有人可以给我一个更详细的解释,说明为什么保存功能是这样的。我对它的理解是错误的,因为我通过进入和编码来学习,但我真的不(明确地)理解当我写save()
或put()
函数时发生了什么。
答案 0 :(得分:1)
您正在目睹在子类中重写的方法。子类化的目的是根据需要重用代码并覆盖功能。有时,这涉及覆盖方法并调用其父级的部分。
super
调用父类的方法。
这与完全不进行子类化完全相同:
def save(...):
return super(MyClass, self).save(...)
相反,如果我们只编写一个没有超级调用的方法,它将完全替换父类方法功能。
def save(...):
print ("I have nothing to do with my parent class")
如果我们想要补充功能(即保留旧的行为但添加额外的东西),我们使用super从新方法中调用原始方法。
def save(...):
print ("I am called directly before the original parent method")
return super(MyClass, self).save(...)