class Question(models.Model):
    question_text = models.CharField(max_length=200)
    pub_date = models.DateTimeField('date published')

    def was_published_recently(self):
        return self.pub_date >= timezone.now() - datetime.timedelta(days=1)

Pourquoi la méthode "was_published_recently" se prend-elle en paramètre? sûrement pub_date sans le «moi». fonctionnerait bien

Titre modifié pour plus de clarté

2
Mascros 11 juil. 2015 à 19:41

4 réponses

Meilleure réponse

Non. pub_date sans le self provoquerait une NameError, car ce serait référencer une variable locale ou globale qui n'existe pas.

pub_date est un attribut de l'instance de modèle et ne peut être référencé que via self.

3
Daniel Roseman 11 juil. 2015 à 16:52

Vous ne pouvez pas appeler la méthode was_published_recently() sans une instance Question, c'est-à-dire self.

pub_date est un champ du modèle Question et sans instance de modèle, il ne contient aucun value car il ne s'agirait que d'une variable. Vous ne pourrez pas obtenir de valeur en appelant la fonction was_published_recently() car elle n'aurait pas la valeur de pub_date pour effectuer le calcul nécessaire.

Donc, pour appeler la méthode was_published_recently(), vous devrez passer l'instance à cette méthode ou appeler directement une instance à l'aide de l'opérateur ..

0
Rahul Gupta 11 juil. 2015 à 17:49

self change l'attribut de l'instance d'un objet. Si vous voulez une méthode de classe, cela ne peut pas changer ou accéder aux attributs d'une variable spécifique. Si pub_date ne change pas, vous pouvez en faire une variable de classe et ajouter @classmethod au-dessus de was_published_recently. Ensuite, changez le self en cls

0
ytpillai 11 juil. 2015 à 16:46

Il n'y a pas de méthode de classe dans votre liste, seulement une méthode ordinaire.

Dans les deux cas, les méthodes python (autres que staticmethod) prennent un paramètre auto représentant l'objet sur lequel elles sont appelées. Ou pour être plus précis, le premier paramètre passera l'objet self, vous ne pouvez donc pas refuser de définir un paramètre self, donnez-lui simplement un nom différent.

Plus de détails sur les méthodes de classe ici: Quand dois-je utiliser @classmethod et quand la méthode def (auto)?

1
Community 23 mai 2017 à 11:43