【问题标题】:Changing save or put functions in database orms更改数据库 orms 中的保存或放置功能
【发布时间】:2013-06-21 16:51:15
【问题描述】:

我在处理数据库时注意到了一些事情,尤其是处理数据库的 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() 函数时,我真的不(清楚地)理解发生了什么。

【问题讨论】:

  • 这就是继承在 Python 中的工作方式。也许您来自其他自动调用父类构造函数的语言;在 Python 中,您必须显式调用它。
  • 不,我明白这是如何工作的,只是我不明白我们将子类放入 super 调用的部分,然后我们只是类型转换它?
  • Python 有多重继承,所以super 函数必须检查祖先以查看应该调用什么方法(有一个称为“钻石模式”的预定义顺序,其中将查看祖先)。

标签: database django google-app-engine orm


【解决方案1】:

您只是目睹了一个方法在子类中被覆盖。子类化的目的是在必要时重用代码和覆盖功能。有时,这涉及覆盖一个方法并调用其父级的各个部分。

super 调用父类的方法。

这与根本不进行子类化完全一样:

def save(...):
   return super(MyClass, self).save(...)

相反,如果我们只编写一个没有 super 调用的方法,它将完全替换父类方法的功能。

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(...)

【讨论】:

  • 好的,但是我们将 Class 作为参数传递,super 怎么知道如何管理它?
  • 一个类被子类化,一个方法被覆盖。
  • @GamesBrainiac,我不确定你到底在问什么,但 super 的复杂性超出了我的技能范围,Raymond 的官方文档指出了这一点:rhettinger.wordpress.com/2011/05/26/super-considered-super
  • @Yuji'Tomita'Tomita:我看了文章,那个人给出的例子很清楚,你可以通过super().__setitem(key, value)看到,这里你只是使用超类来设置物品。我不明白的是super() 类本身如何带参数?例如,如果您将其类型转换为超类,那么您不会丢失刚刚存储在新子类中的数据吗?我所说的参数是super(subclass, self)
  • @GamesBrainiac:我猜 Python 核心开发人员也问过同样的问题,这就是为什么 super 在 Python 3 中不再需要参数。见python.org/dev/peps/pep-3135
猜你喜欢
  • 1970-01-01
  • 2012-07-31
  • 2020-02-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多