Une question sur la syntaxe en Python

Le problème exposé dans ce sujet a été résolu.

Bonjour à tous,

Je me suis récemment mis à Python, que j'avais envie d'apprendre depuis longtemps, et encore plus récemment à Django, que je veux utiliser pour réaliser un projet Web.

J'ai de bonnes bases en programmation et en algorithmique (C, Java, PHP) donc ça a été assez facile d'assimiler les bases de Python et de comprendre ses multiples avantages. J'utilise également Symfony2 quasi-quotidiennement, je suis donc assez familier à l'environnement du Web et de ses frameworks.

Ma question porte sur le tutoriel Django du site officiel, plus précisement cette sous-partie. Il y a deux points qui m'interpellent dans les modèles présentés :

  • Jusqu'à présent, dans le tutoriel que j'avais suivi, on déclarait les variables de classes de la manière suivante :
1
2
3
class MaClasse(object):
    def __init__(self):
        self.var1, self.var2 = 1, 2

Or je vois ici que les variables de classes ne sont pas définies de la même manière. Ces deux façons de faire sont-elles équivalentes ?

  • Dans la partie suivante, on appelle le constructeur de l'objet, puisqu'on utilise la syntaxe suivante :
1
q = Question(question_text="What's new?", pub_date=timezone.now())

Or on n'a pas défini le constructeur (en tout cas explicitement). J'aimerais donc savoir ce qu'il se passe quand on utilise cette syntaxe.

Merci d'avance de votre aide, et je vous prie de m'excuser de la noobitude de mes questions, je me mets juste au Python (qui est un beau langage !) :-)

Que tu puisse définir tes attributs ailleurs que dans ton constructeur ne me choque pas vraiment, en tout cas c'est permis par python. Le tout pour éviter les problèmes, c'est de bien redéfinir mes mutables (liste, dico, …) dans ton constructeur, ou alors tu va avoir des surprises (ce mutable sera le même pour toute les instances de ta classe).

Quand aux constructeurs qui te paraisse bizarre, n'oublie pas que ta classe hérite directement de Models dans ce cas là, donc le constructeur de la classe parente est appelé par défaut. Du reste, je parie que tout se passe à coup de **kwargs et de setattr(). Regarde la doc python pour cette dernière fonction et google le mot clé "kwargs" pour la première, et tu devrais comprendre ce qu'il y a là derrière :)

1
2
3
class MaClasse(object):
    def __init__(self):
        self.var1, self.var2 = 1, 2

Or je vois ici que les variables de classes ne sont pas définies de la même manière. Ces deux façons de faire sont-elles équivalentes ?

Theo

Justement, dans ton exemple, il s'agit de variable d'instances et non de classe (elles sont propre à un self, tandis que les variables de classe sont partagées par toutes les instances).

Il faut aussi savoir que Django possède un ORM très puissant, que tu utilises en héritant de models.Model. En interne, ça utilise des métaclasses utilisant justement tes variables de classe pour savoir de quels champs disposent tes modèles, et donc générer automatiquement des attributs et méthodes pour ces classes (on parle de métaprogrammation). Le constructeur (__init__) est probablement l'une de ces méthodes, ou alors une méthode héritée de models.Model.

Merci à vous deux pour vos reponses.

En effet j'avais omis le fait qu'on hérite de models.Model, ce qui change absolument tout dans ma façon de voir les choses ^^.

Ça me semble plus clair, donc si je comprends bien on crée les variables de classe, et à partir de celles-ci quand on créera une instance, les variables d'instace correspondantes seront créées).

Merci encore de votre aide !

Connectez-vous pour pouvoir poster un message.
Connexion

Pas encore membre ?

Créez un compte en une minute pour profiter pleinement de toutes les fonctionnalités de Zeste de Savoir. Ici, tout est gratuit et sans publicité.
Créer un compte