python - 在django模型中使用python super 函数

标签 python django super

这是我正在学习的 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(...)不会调用Snippetsave方法;它会调用其他类的save 方法。很容易认为这个“其他类”是 Snippet 的“父类”或“父类(super class)”,即 models.Model,但这可能不是真的,以这种方式理解 super 是绝对错误的。 super(Snippet, self) 最终表示哪个类取决于 self,尤其是其类的 MRO。

可以找到关于MROsuper 的非常好的描述(附有图片!)here .

关于python - 在django模型中使用python super 函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7141820/

相关文章:

python - Django REST Framework 中 PUT 和 PATCH 没有区别

java - 什么是 PECS(生产者扩展消费者 super )?

java - 为什么对父类构造函数的调用不调用在子类中重写的父方法?

python - 大于 x 时替换数组中的值

Python,机器学习: Are there any API that can split dataset and shuffle?

Python 模块 : how to keep private symbol table private?

python - 如何将注册的过滤器从一个 Django View 导入到另一个?

python - 使用 JSON 的 Django 模板

java - 当子类中使用字 "super"时,字 super 强制代码做什么?

python - 计算 Pandas 中出现次数的最有效方法是什么?