这是我正在学习的 django 教程中的一些代码。我以前从未在python中遇到过super函数,这里使用它的方式与我在网上看到的例子不同。也就是说,通常当你使用 super 时,你不是有多个类吗?它在最后一行:super(Snippet, self).save(force_insert, force_update)
您能否准确解释那里发生了什么以及编写它的替代方法是什么。好像是 save 方法在这里调用自己?
class Snippet(models.Model):
title = models.CharField(max_length=255)
language = models.ForeignKey(Language)
author = models.ForeignKey(User)
description = models.TextField()
description_html = models.TextField(editable=False)
code = models.TextField()
highlighted_code = models.TextField(editable=False)
tags = TagField()
pub_date = models.DateTimeField(editable=False)
updated_date = models.DateTimeField(editable=False)
class Meta:
ordering = ['-pub_date']
def __unicode__(self):
return self.title
def save(self, force_insert=False, force_update=False):
if not self.id:
self.pub_date = datetime.datetime.now()
self.updated_date = datetime.datetime.now()
self.description_html = markdown(self.description)
self.highlighted_code = self.highlight()
super(Snippet, self).save(force_insert, force_update)
最佳答案
super(Snippet, self)
导致 Python 在 MRO 中查找self 类的(即 self.__class__.mro()
用于 Snippet
之后列出的 next 类。它返回一个 super
对象充当该类的代理。也就是说,在 super
对象上调用方法就像在类上调用该方法一样。
super(Snippet, self).save(...)
调用该类的 save
方法,self
绑定(bind)到第一个参数.
所以super(Snippet, self).save(...)
不会调用Snippet
的save
方法;它会调用其他类的save
方法。很容易认为这个“其他类”是 Snippet
的“父类”或“父类(super class)”,即
models.Model
,但这可能不是真的,以这种方式理解 super
是绝对错误的。 super(Snippet, self)
最终表示哪个类取决于 self
,尤其是其类的 MRO。
可以找到关于MRO
和super
的非常好的描述(附有图片!)here .
关于python - 在django模型中使用python super 函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7141820/