utilisation de super fonction python dans le modèle django
Voici un peu de code dans un django tutoriel que je vais à travers. Je n'ai jamais rencontré la super fonction en python avant et la façon dont il est utilisé ici est différent de celui des exemples que j'ai vu en ligne. I. e., habituellement, lorsque vous utilisez super, vous n'avez pas plusieurs classes? C'est dans la dernière ligne: super(Snippet, self).save(force_insert, force_update)
Pourriez-vous expliquer exactement ce qui se passe là-bas et ce serait une autre façon d'écrire. Il semble juste comme la méthode save est d'appeler lui-même ici?
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)
source d'informationauteur
Vous devez vous connecter pour publier un commentaire.
super(Snippet, self)
causes Python à la regarder dans les MRO de la classe de l'auto (c'est à direself.__class__.mro()
pour la prochaine classe répertorié aprèsSnippet
. Elle renvoie unesuper
objet qui agit comme un proxy pour la classe. C'est, à l'appel d'une méthode sur lesuper
objet agit comme l'appel de cette méthode à la classe.super(Snippet, self).save(...)
appels de la classesave
méthode, avecself
lié au premier argument.Donc
super(Snippet, self).save(...)
ne vais pas appelerSnippet
'ssave
méthode; il va appeler certains autres de la classesave
méthode. Il est tentant de penser que cette "classe" est la classe mère" ou "super-classe" deSnippet
qui est,models.Model
mais qui peut ne pas être vrai et il est absolument faux d'appréhendersuper
de cette façon. La classesuper(Snippet, self)
constitue, en définitive, dépendself
et en particulier de sa classe de MRO.Une très bonne description de la
MRO
etsuper
(avec photos!) peut être trouvé ici.Je ne vais pas expliquer à nouveau ce qu'unutbu expliqué sur les super-classes, cependant vous obtenir le même effet avec le code suivant :
Ce n'est PAS une meilleure façon de l'écrire, car si vous venez à changer la classe de l'héritage par l'ajout d'une classe intermédiaire entre le Modèle et l'Extrait vous devez également avoir à modifier cette ligne (qui vous serait le plus susceptible d'oublier). De toute façon c'est une bonne chose à savoir.
Je peux aussi ajouter que le super instruction ne fonctionne que si la classe que vous héritez de s'étend de l'objet, sinon vous obtenez une exception.