Derniers messages sur Zeste de Savoirhttps://zestedesavoir.com/forums/2019-04-03T13:10:33+02:00Les derniers messages parus sur le forum de Zeste de Savoir.Exercice de programmation orientée objet sous Python, message #2013252019-04-03T13:10:33+02:00Alexouu/@Alexouuhttps://zestedesavoir.com/forums/sujet/12278/exercice-de-programmation-orientee-objet-sous-python/?page=1#p201325<p>Effectivement c’est possible aussi tu as raison <img src="/static/smileys/smile.png" alt=":)" class="smiley"></p>Exercice de programmation orientée objet sous Python, message #2012662019-04-02T18:14:06+02:00fred1599/@fred1599https://zestedesavoir.com/forums/sujet/12278/exercice-de-programmation-orientee-objet-sous-python/?page=1#p201266<figure><blockquote>
<p>En ce qui concerne le CSV, je pensais faire comme tu dis à la fin de ton message, à savoir créer spécialement une classe qui load le CSV et se charge de la lecture et de l’écriture (pas le droit d’utiliser SQL ici :))</p>
</blockquote><figcaption><a href="https://zestedesavoir.com/forums/sujet/12278/exercice-de-programmation-orientee-objet-sous-python/?page=1#p201215">Alexouu</a></figcaption></figure>
<p>Oui, ou pourquoi pas juste un module avec les fonctions nécessaires à l’utilisation du fichier csv ?</p>Exercice de programmation orientée objet sous Python, message #2012152019-04-01T18:11:45+02:00Alexouu/@Alexouuhttps://zestedesavoir.com/forums/sujet/12278/exercice-de-programmation-orientee-objet-sous-python/?page=1#p201215<p>Pardon pour ma réaction tardive <a href="/membres/voir/rezemika/" rel="nofollow" class="ping ping-link">@<span class="ping-username">rezemika</span></a> et merci !</p>
<p>Pour la version de Python je comprends bien qu’il falloir passer à Python 3, c’est simplement qu’on utilise la 2.7 pour ce projet <img src="/static/smileys/smile.png" alt=":)" class="smiley"></p>
<p>Pour les utilisateurs: Non il n’y a pas de base de données utilisateurs qui existe déjà.
Mais tu as raison, il va certainement falloir stocker ces données quelque part !
(Encore une fois c’est moi qui vais créer 2–3 comptes à la main juste pour montrer que mon programme tourne bien)</p>
<p>Pour ce qui est des hashs, je comprends que dans la réalité on devrait vraiment s’en pré-occuper mais pour ce projet-là il n’y a pas besoin de s’embêter avec ça mais merci du tuyau <img src="/static/smileys/smile.png" alt=":)" class="smiley"></p>
<p>En ce qui concerne le CSV, je pensais faire comme tu dis à la fin de ton message, à savoir créer spécialement une classe qui load le CSV et se charge de la lecture et de l’écriture (pas le droit d’utiliser SQL ici :))</p>Exercice de programmation orientée objet sous Python, message #2011042019-03-30T12:40:20+01:00rezemika/@rezemikahttps://zestedesavoir.com/forums/sujet/12278/exercice-de-programmation-orientee-objet-sous-python/?page=1#p201104<figure><blockquote>
<p><a href="/membres/voir/Necros211/" rel="nofollow" class="ping ping-link">@<span class="ping-username">Necros211</span></a> Je viens de re-vérifier et je ne m’étais pas trompé, c’est bien Python 2.7 <img src="/static/smileys/smile.png" alt=":)" class="smiley"></p>
</blockquote><figcaption><a href="https://zestedesavoir.com/forums/sujet/12278/exercice-de-programmation-orientee-objet-sous-python/?page=1#p201058">Alexouu</a></figcaption></figure>
<p>Hum, ça risque de te poser problème à long terme, Python 2.7 ne sera plus maintenu à partir de 2020, et de moins en moins de modules sont compatibles avec Python 2.7. À moins qu’un impératif technique absolu ne t’en empêche, il serait bien plus aisé de penser à migrer vers Python 3.</p>
<blockquote>
<p>Contrairement à la base de données des produits qui, elle, existe déjà (via le .csv), rien n’indique dans le sujet qu’il y a déjà des utilisateurs.
(Cela dit, pour une question de cohérence, on pourrait envisager qu’il existe déjà ne serait-ce qu’un seul admin, parce qu’a priori la BDD ne s’est pas créée toute seule, mais ce n’est pas le coeur du problème :)).
Donc en fait mon idée c’est de créer un contributeur et un admin afin de tester le programme, càd montrer que mon contributeur va devoir se connecter, pourra effectuer certaines tâches et d’autres non, tandis que mon admin pourra effectuer toutes les tâches requises (sauf créer un autre compte).
Pas besoin de créer un visiteur simple car il n’a pas de compte, on est d’accord?</p>
</blockquote>
<p>Je ne suis pas sur de comprendre. Tu as une base de données d’utilisateurs ou pas encore ? Si oui, elle se base sur quelle technologie ? C’est là aussi du CSV, c’est du SQL, ou encore autre chose ?</p>
<blockquote>
<p>Au passage, dans le sujet un compte c’est pseudo (unique) +mot de passe, donc on doit pouvoir stocker tous ces couples dans un dictionnaire ou une liste de liste je suppose?</p>
</blockquote>
<p>En effet, mais il faudra de toute façon stocker ces données dans un fichier quelconque. Aussi, je te rappelle qu’il est largement conseillé (pour ne pas dire quasi indispensable) de stocker les <em>hashs</em> des mots de passe, et pas les mots de passe eux-mêmes. Aussi, si tu veux qu’il y ait un statut admin, il te faudra aussi stocker ce statut avec les identifiants.</p>
<blockquote>
<p>Si j’entre 2 ou 3 on va me demander de me connecter, évidemment pour le contributeur ça va fonctionner que si un admin a validé mon compte.</p>
</blockquote>
<p>Une solution plus simple serait de proposer d’emblée une fenêtre de connexion avec un bouton "Mode visiteur" (par exemple), et quand l’utilisateur se connecte, vérifier s’il a le statut d’administrateur ou non.</p>
<blockquote>
<p>Mais du coup à part tes classes User et Product, lesquelles tu créerais?</p>
</blockquote>
<p>Eh bien tout dépend des technologies utilisées pour les différentes bases de données. Est-ce que l’import de ton CSV vers une base de données SQL est envisageable ? Comment stocke-tu les utilisateurs ?</p>
<p>Si tu reste sur du CSV pour tout, alors tu peux aussi faire une classe qui accède à un CSV et qui se charge de la lecture et de l’écriture, pour ne pas avoir à réécrire des <code>open()</code> partout dans ton code.</p>Exercice de programmation orientée objet sous Python, message #2010582019-03-29T13:07:57+01:00Alexouu/@Alexouuhttps://zestedesavoir.com/forums/sujet/12278/exercice-de-programmation-orientee-objet-sous-python/?page=1#p201058<p><a href="/membres/voir/Necros211/" rel="nofollow" class="ping ping-link">@<span class="ping-username">Necros211</span></a> Je viens de re-vérifier et je ne m’étais pas trompé, c’est bien Python 2.7 <img src="/static/smileys/smile.png" alt=":)" class="smiley"></p>Exercice de programmation orientée objet sous Python, message #2010542019-03-29T11:58:50+01:00Necros211/@Necros211https://zestedesavoir.com/forums/sujet/12278/exercice-de-programmation-orientee-objet-sous-python/?page=1#p201054<blockquote>
<p>J’utilise Python 2.7 sous Spyder 3.</p>
</blockquote>
<p>Tu ne te serais pas tromper d’un chiffre ?</p>
<p>Ce serais pas plutôt Python 3.7 ?</p>Exercice de programmation orientée objet sous Python, message #2010182019-03-28T17:46:33+01:00Alexouu/@Alexouuhttps://zestedesavoir.com/forums/sujet/12278/exercice-de-programmation-orientee-objet-sous-python/?page=1#p201018<p>Merci <a href="/membres/voir/Amaury/" rel="nofollow" class="ping ping-link">@<span class="ping-username">Amaury</span></a> !</p>
<p>Pour te répondre (et réagir) un peu dans le désordre:</p>
<p>J’utilise Python 2.7 sous Spyder 3.</p>
<p>Quant au stockage des utilisateurs: </p>
<p>Contrairement à la base de données des produits qui, elle, existe déjà (via le .csv), rien n’indique dans le sujet qu’il y a déjà des utilisateurs.
(Cela dit, pour une question de cohérence, on pourrait envisager qu’il existe déjà ne serait-ce qu’un seul admin, parce qu’a priori la BDD ne s’est pas créée toute seule, mais ce n’est pas le coeur du problème :)).</p>
<p>Donc en fait mon idée c’est de créer un contributeur et un admin afin de tester le programme, càd montrer que mon contributeur va devoir se connecter, pourra effectuer certaines tâches et d’autres non, tandis que mon admin pourra effectuer toutes les tâches requises (sauf créer un autre compte).
Pas besoin de créer un visiteur simple car il n’a pas de compte, on est d’accord?</p>
<p>Au passage, dans le sujet un compte c’est pseudo (unique) +mot de passe, donc on doit pouvoir stocker tous ces couples dans un dictionnaire ou une liste de liste je suppose?</p>
<p>L’idée du sujet c’est simplement quand on lance le programme, la console nous demande quel type de consultant on est, du style:</p>
<p>Quel type d’utilisateur êtes-vous?</p>
<p>1: Visiteur</p>
<p>2: Contributeur</p>
<p>3: Administrateur</p>
<p>Puis si j’entre 1 dans la console, on va m’afficher la liste des tâches que je peux faire, toujours associées à un entier qui sera mon input dans la console (aussi à un moment donné on va me proposer de créer un compte pour passer contributeur).</p>
<p>Si j’entre 2 ou 3 on va me demander de me connecter, évidemment pour le contributeur ça va fonctionner que si un admin a validé mon compte.</p>
<p>Petite précision:</p>
<p>Du coup si j’ai entré 2, pour contributeur, et que ma connection se soit bien déroulée (bon pseudo+MdP + compte validé), on ne va pas me proposer derrière de valider un compte car seuls les administrateurs peuvent le faire.</p>
<p>NEANMOINS, il faut quand même faire en sorte que si je suis un contributeur et que dans la liste suivante je choisis "créer/modifier un produit" (ce qui est possible d’après le sujet donc moi je vais faire en sorte de l’afficher dans ladite liste), le programme fasse une vérification pour s’assurer que j’en ai (ici le contributeur donc) le droit.</p>
<p>J’ai bien conscience que ce que j’explique est pas forcément hyper clair haha !</p>
<p>Sinon, merci beaucoup pour ton explication de ta classe User <img src="/static/smileys/smile.png" alt=":)" class="smiley"> <img src="/static/smileys/smile.png" alt=":)" class="smiley"></p>
<p>Mais du coup à part tes classes User et Product, lesquelles tu créerais?</p>
<p>Alex</p>Exercice de programmation orientée objet sous Python, message #2010132019-03-28T17:03:49+01:00Amaury/@Amauryhttps://zestedesavoir.com/forums/sujet/12278/exercice-de-programmation-orientee-objet-sous-python/?page=1#p201013<p>Grillé par Amaury mais ton message a l’avantage de contenir un exemple concret <img src="/static/smileys/hihi.png" alt="^^" class="smiley"></p>
<p>(+1 pour l’avantage d’utiliser un vrai <abbr title="Système de Gestion de Bases de Données">SGBD</abbr> si c’est un projet à long terme, et si c’est possible bien sûr — p.ex. SQLite pour les petites quantités de données portables et stockées dans un fichier, ou MySQL pour des trucs plus gros ou performants)</p>Exercice de programmation orientée objet sous Python, message #2010122019-03-28T17:01:37+01:00rezemika/@rezemikahttps://zestedesavoir.com/forums/sujet/12278/exercice-de-programmation-orientee-objet-sous-python/?page=1#p201012<p><em>Edit : grillé par <a href="/membres/voir/Amaury/" rel="nofollow" class="ping ping-link">@<span class="ping-username">Amaury</span></a>.</em></p>
<p>Hum, j’avais mal lu. Je dois préciser qu’en plus de ta base de produits, tu devra aussi créer une base d’utilisateurs. Puisque tu utilise du CSV pour la première, tu ne pourra pas faire une gestion sous forme de tables ou utiliser des champs avec des relations comme on en trouve dans les bases de données SQL. Tu peux cependant t’en rapprocher, si chaque produit et chaque utilisateur contiennent un champ unique qui leur servira d’ID.</p>
<p>Ensuite, en lisant chaque ligne du CSV, tu récupère probablement un <em>tuple</em>. Tu peux alors le passer au constructeur d’une classe Python qui aura diverses méthodes pour réaliser les actions que tu veux.</p>
<div class="hljs-code-div"><div class="hljs-line-numbers"><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span></div><pre><code class="hljs language-python"><span class="hljs-comment"># Colonnes : "nom", "prix_ht", "fabricant"</span>
csv_line = (<span class="hljs-string">"Fromage"</span>, <span class="hljs-string">"5.50"</span>, <span class="hljs-string">"Fromager X"</span>)
<span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">Product</span>:</span>
<span class="hljs-function"><span class="hljs-keyword">def</span> <span class="hljs-title">__init__</span><span class="hljs-params">(self, nom, prix, fabricant)</span>:</span>
self.nom = nom
self.prix = float(prix) <span class="hljs-comment"># Ici, il vaudrait mieux utiliser le module "money" : https://github.com/carlospalol/money</span>
self.fabricant = fabricant
<span class="hljs-function"><span class="hljs-keyword">def</span> <span class="hljs-title">prix_ttc</span><span class="hljs-params">(self)</span>:</span>
<span class="hljs-keyword">return</span> self.prix * <span class="hljs-number">1.2</span>
<span class="hljs-comment"># Voir http://sametmax.com/operateur-splat-ou-etoile-en-python/</span>
product = Product(*csv_line)
</code></pre></div>
<p>Naturellement, il faudra aussi (ou en tout cas, ce serait bien plus pratique) créer une classe qui aura à gérer les interactions avec ta base CSV, notamment pour récupérer les données et les mettre à jour.</p>
<p>Si c’est possible pour toi et que ton projet est destiné à avoir une vie longue, il serait d’ailleurs sans doute bien plus pratique d’avoir une base de données SQL pour gérer tout ça (dans laquelle tu n’aurais qu’à faire une grosse importation la première fois, depuis le CSV).</p>Exercice de programmation orientée objet sous Python, message #2010112019-03-28T16:52:38+01:00Amaury/@Amauryhttps://zestedesavoir.com/forums/sujet/12278/exercice-de-programmation-orientee-objet-sous-python/?page=1#p201011<p>Pour ce genre de choses, Django est en effet tout indiqué (si tu as le droit de l’utiliser) : il gère nativement les modèles en base de donnée (une classe représentant les données, concrètement), les utilisateurs, les permissions, et permet même de générer automatiquement les interfaces de base de création, modification et suppression (<abbr title="Create Read Update Delete : les quatre fonctions de base de gestion des données dans une application.">CRUD</abbr>) grâce à l’administration embarquée.</p>
<p>Cela dit, vu qu’il mâche tout le travail (et pas qu’un peu), c’est très pratique mais moins bien pour apprendre, étant donné que tu ne le fais pas toi-même.</p>
<p>Concernant les classes je pense que l’idée de <a href="/membres/voir/rezemika/" rel="nofollow" class="ping ping-link">@<span class="ping-username">rezemika</span></a> est la bonne. On pourrait imaginer une classe <code>User</code> avec un attribut booléen <code>is_admin</code> (les visiteurs n’auraient pas de compte, donc pas d’instance User ; les contributeurs une instance avec <code>is_admin = False</code> et les administrateurs <code>is_admin = True</code>) et un <code>is_active</code> qui serait à <code>False</code> par défaut et passerait à <code>True</code> quand un administrateur le valide, en plus des champs classique mail/mot de passe.</p>
<p>Et une classe <code>Product</code> dont chaque instance représenterait une ligne du CSV (on transformerait le CSV en une liste d’instance de <code>Product</code> en chargeant le CSV), avec des attributs correspondant aux colonnes du fichier source.</p>
<p>Ensuite lors de la manipulation, le code vérifierait l’utilisateur actif (par exemple stocké dans une session — selon l’outil utilisé — et valant <code>None</code> si anonyme/visiteur) et autoriserait ou non en fonction du statut d’administrateur, de faire telle ou telle action.</p>
<p>Il y a plein d’autres façons de faire cela, bien sûr. Par exemple, celle de Django repose sur un système de permissions attribuées à des groupes de permissions eux-même attribués à des utilisateurs ; le code vérifiant qu’une permission (plutôt qu’un statut administrateur) est donnée. Par exemple, une permission pourrait ici être <code>can_create_product</code>, <code>can_update_product</code>, <code>can_delete_product</code>, <code>can_validate_user</code>, <code>can_delete_user</code>… L’inconvénient, c’est que c’est plus compliqué à mettre en place.</p>
<p>Mais je me pose une question. Où seraient stockés les utilisateurs ? Dans une base de données ? Ou alors en faisant simplement confiance pour que chacun dise « je suis X » sans vérification (possible si c’est juste un exercice) ?</p>
<p>Et quel genre de support utilises-tu ? Web ? Console ? Autre chose ?</p>Exercice de programmation orientée objet sous Python, message #2010062019-03-28T16:06:26+01:00Alexouu/@Alexouuhttps://zestedesavoir.com/forums/sujet/12278/exercice-de-programmation-orientee-objet-sous-python/?page=1#p201006<p>Salut et merci de m’avoir répondu !</p>
<p>Effectivement je n’utilise ici pas Django mais ayant fait quelques recherches sur internet j’avais cru comprendre que c’est assez pratique pour ce genre de problèmes.</p>
<p>Par contre tu pourrais un peu me développer ton idée de classes s’il te plaît? <img src="/static/smileys/smile.png" alt=":)" class="smiley"></p>Exercice de programmation orientée objet sous Python, message #2010042019-03-28T15:31:30+01:00rezemika/@rezemikahttps://zestedesavoir.com/forums/sujet/12278/exercice-de-programmation-orientee-objet-sous-python/?page=1#p201004<p>Salut !</p>
<p>Tout dépend de la finesse de gestion que tu veux avoir. Mais <em>a priori</em>, le plus simple serait probablement d’avoir une classe généraliste pour un compte enregistré en BDD, qui possèderait un attribut qui indiquerait si ce compte a des droits administrateurs ou non.</p>
<p>La gestion de base de données de Django est très pratique pour cela. Même si tu n’utilise pas Django pour ce projet, voir comment il marche pourrait surement t’inspirer pour ton projet. La gestion des permissions y est notamment très pratique. <img src="/static/smileys/clin.png" alt=";)" class="smiley"></p>Exercice de programmation orientée objet sous Python, message #2009972019-03-28T13:54:17+01:00Alexouu/@Alexouuhttps://zestedesavoir.com/forums/sujet/12278/exercice-de-programmation-orientee-objet-sous-python/?page=1#p200997<p>Bonjour à tous!</p>
<p>Je dois implémenter un programme sous Python en utilisant la programmation orientée objet mais je me heurte à plusieurs difficultés, le sujet de mon exercice étant le suivant (en le résumant et simplifiant):</p>
<p>On dispose d’une base de données (fichier .csv que l’on doit donc importer sur Python) de produits alimentaires où chaque produit est caractérisé par son code-barre (info unique au produit), date d’ajout à la BdD, lieu(x) de fabrication, liste des ingrédients, etc…</p>
<p>A partir de cette base de données, on distingue 3 types de consultants différents:</p>
<p>-Le visiteur, qui peut:</p>
<div class="hljs-code-div"><div class="hljs-line-numbers"><span></span><span></span><span></span></div><pre><code class="hljs language-haml"> -<span class="ruby">Afficher un produit (ses caractéristiques citées plus haut)
</span>
-<span class="ruby">Se créer un compte
</span></code></pre></div>
<p>-Le contributeur, qui peut:</p>
<div class="hljs-code-div"><div class="hljs-line-numbers"><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span></div><pre><code class="hljs language-haml"> -<span class="ruby">Afficher lui aussi un produit
</span>
-<span class="ruby">Créer/Modifier un produit
</span>
-<span class="ruby">Se connecter/déconnecter
</span>
-<span class="ruby">Il ne peut se créer un compte car il en possède forcément déjà un (Un visiteur se créant un compte
</span> devient nécessairement contributeur
</code></pre></div>
<p>-Enfin, l’administrateur, qui peut:</p>
<div class="hljs-code-div"><div class="hljs-line-numbers"><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span></div><pre><code class="hljs language-haml"> -<span class="ruby">Afficher lui aussi un produit
</span>
-<span class="ruby">Créer/Modifier lui aussi un produit
</span>
-<span class="ruby">Supprimer un produit
</span>
-<span class="ruby">Se connecter/déconnecter lui aussi
</span>
-<span class="ruby">Valider/Supprimer un compte de contributeur (plus <span class="hljs-symbol">clairement:</span> chaque visiteur se créant un compte doit
</span> au préalable voir son compte validé par un administrateur avant de devenir contributeur)
-<span class="ruby">Il ne peut lui non plus se créer un compte (même raison que pour le contributeur)
</span></code></pre></div>
<p>L’idée finale étant qu’une fois le programme lancé, il soit demandé au consultant son statut (visiteur/contributeur/administrateur), pour qu’on lui propose les tâches qu’il a le droit d’effectuer.</p>
<p>J’ai dans un premier temps du mal à établir les classes qu’il va falloir implémenter.</p>
<p>Faut-il implémenter par exemple les 5 classes Visiteur,Contributeur,Administrateur,Compte et Produit?</p>
<p>De plus je vois mal comment gérer les autorisations d’accès ainsi que les connections/ déconnections.</p>
<p>Merci par avance et n’hésitez pas à me demander si vous souhaitez d’autres précisions !
Alex <img src="/static/smileys/smile.png" alt=":)" class="smiley"></p>Exécuter un code dans la méthode __init__ d'une classe, mais pas pour sa fille, message #1952692018-12-19T21:44:42+01:00Rockaround/@Rockaroundhttps://zestedesavoir.com/forums/sujet/11791/executer-un-code-dans-la-methode-__init__-dune-classe-mais-pas-pour-sa-fille/?page=1#p195269<p>Merci encore pour les réponses. J’ai compris certaines choses, me si tout n’est pas encore clair (sur ce sujet précis hein? sur d’autres sujets, j’ai encore plein de questions <img src="/static/smileys/heureux.png" alt=":D" class="smiley"> ).</p>
<p>Ce que j’ai fait, en suivant vos conseils :</p>
<ul>
<li>J’ai retiré les méthodes <code>__init__</code> complètement.</li>
<li>J’ai nommé de la même manière les méthodes <code>setUI</code> des deux classes. Celle de la fille appelle celle de la mère.</li>
<li>J’ai retiré les self.show() de mes classes. À la place, dans mon code, après l’instanciation <code>fenetre=AddSentence()</code>, j’appelle la méthode <code>fenetre.setUI()</code>, et je continue avec <code>fenetre.show()</code></li>
</ul>
<p>Donc ma question initiale n’a pas eu de réponse directe, mais mon problème est résolu. Merci encore ! Reste pour moi à bien comprendre tout ca, et à comprendre comment mes méthodes <code>clicked.connect(method)</code> vont faire pour changer l’affichage.</p>Exécuter un code dans la méthode __init__ d'une classe, mais pas pour sa fille, message #1952332018-12-19T11:05:27+01:00entwanne/@entwannehttps://zestedesavoir.com/forums/sujet/11791/executer-un-code-dans-la-methode-__init__-dune-classe-mais-pas-pour-sa-fille/?page=1#p195233<figure><blockquote>
<p>Dans ce cas, je perds les bénéfices de l’héritage, non ? Je veux que tout ce qui est défini dans la méthode <code>setUI</code> classe mère soit utilisé (là j’ai simplifié, mais ça inclue un <code>menuBar</code>, des actions diverses (qui ne devraient peut-être pas être dans la méthode <code>setUI</code>, mais c’était comme ça dans l’exemple que j’avais trouvé)). Je compte avoir plusieurs classes filles, donc tout recopier va dupliquer le code pas mal. Il est également possible que je m’y prenne entièrement mal.</p>
</blockquote><figcaption><a href="https://zestedesavoir.com/forums/sujet/11791/executer-un-code-dans-la-methode-__init__-dune-classe-mais-pas-pour-sa-fille/?page=1#p195229">Rockaround</a></figcaption></figure>
<p>C’est tout le principe de <code>super</code> : permettre dans une classe fille de faire appel aux méthodes d’une parente. C’est ce que tu fais dans la méthode <code>__init__</code> d'<code>AddSentence</code>.</p>
<p>Sauf que cette méthode <code>__init__</code> n’apporte rien, tu pourrais très bien l’omettre et simplement redéfinir une <code>setUI</code> où tu ferais appel à la méthode parente.</p>
<p>Pour moi le code de la classe <code>AddSentence</code> devrait ressembler à :</p>
<div class="hljs-code-div"><div class="hljs-line-numbers"><span></span><span></span><span></span><span></span><span></span><span></span></div><pre><code class="hljs language-python"><span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">AddSentence</span><span class="hljs-params">(Main)</span>:</span>
<span class="hljs-function"><span class="hljs-keyword">def</span> <span class="hljs-title">setUI</span><span class="hljs-params">(self)</span>:</span>
super().setUI()
self.translationField=QLineEdit(self)
self.translationField.move(<span class="hljs-number">400</span>,<span class="hljs-number">300</span>)
self.translationField.resize(<span class="hljs-number">400</span>,<span class="hljs-number">50</span>)
</code></pre></div>
<figure><blockquote>
<p>Et je pense comprendre que la solution à base de <code>mro</code> n’est pas bonne, mais je ne comprends toujours pas pourquoi j’ai une erreur. J’ai un sentiment que ça vient d’une différenciation classe/instance de la classe, mais honnêtement, je n’en sais rien.</p>
</blockquote><figcaption><a href="https://zestedesavoir.com/forums/sujet/11791/executer-un-code-dans-la-methode-__init__-dune-classe-mais-pas-pour-sa-fille/?page=1#p195229">Rockaround</a></figcaption></figure>
<p>En effet, <code>mro</code> est une méthode qui existe sur la classe, pas sur ses instances.</p>
<p>Tu pourrais te dire que ce n’est pas logique, car les méthodes de classes sont censées être accessibles par les instances. Mais <code>mro</code> n’est pas une méthode de classe, c’est une méthode de <code>type</code>, qui est donc définie pour les instances de <code>type</code>.
<code>AddSentence</code> est une instance de <code>type</code>, <code>AddSentence()</code> n’en est pas une.</p>
<div class="hljs-code-div"><div class="hljs-line-numbers"><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span></div><pre><code class="hljs language-python"><span class="hljs-meta">>>> </span><span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">A</span>:</span>
<span class="hljs-meta">... </span> <span class="hljs-keyword">pass</span>
<span class="hljs-meta">... </span>
<span class="hljs-meta">>>> </span>a = A()
<span class="hljs-meta">>>> </span>
<span class="hljs-meta">>>> </span>A.mro()
[<<span class="hljs-class"><span class="hljs-keyword">class</span> '<span class="hljs-title">__main__</span>.<span class="hljs-title">A</span>'>, <<span class="hljs-title">class</span> '<span class="hljs-title">object</span>'>]
>>> <span class="hljs-title">a</span>.<span class="hljs-title">mro</span><span class="hljs-params">()</span>
<span class="hljs-title">Traceback</span> <span class="hljs-params">(most recent call last)</span>:</span>
File <span class="hljs-string">"<stdin>"</span>, line <span class="hljs-number">1</span>, <span class="hljs-keyword">in</span> <module>
AttributeError: <span class="hljs-string">'A'</span> object has no attribute <span class="hljs-string">'mro'</span>
<span class="hljs-meta">>>> </span>A.mro
<built-<span class="hljs-keyword">in</span> method mro of type object at <span class="hljs-number">0x5626f6a0bc38</span>>
<span class="hljs-meta">>>> </span>type.mro
<method <span class="hljs-string">'mro'</span> of <span class="hljs-string">'type'</span> objects>
<span class="hljs-meta">>>> </span>type.mro(A)
[<<span class="hljs-class"><span class="hljs-keyword">class</span> '<span class="hljs-title">__main__</span>.<span class="hljs-title">A</span>'>, <<span class="hljs-title">class</span> '<span class="hljs-title">object</span>'>]
</span></code></pre></div>Exécuter un code dans la méthode __init__ d'une classe, mais pas pour sa fille, message #1952292018-12-19T10:32:03+01:00Rockaround/@Rockaroundhttps://zestedesavoir.com/forums/sujet/11791/executer-un-code-dans-la-methode-__init__-dune-classe-mais-pas-pour-sa-fille/?page=1#p195229<p>Merci pour vos réponses.</p>
<blockquote>
<p>n’hésite pas à aller sur celle de Qt.</p>
</blockquote>
<p>Merci, j’irai voir après le travail si cette documentation me convient mieux.</p>
<blockquote>
<p>Aussi, pourquoi avoir nommé ta méthode <code>setUIAdd</code> dans <code>AddSentence</code> et non <code>setUI</code> comme dans la classe mère ?</p>
<p>Une autre façon est de redéfinir <code>setUI</code> dans ta classe fille </p>
</blockquote>
<p>Dans ce cas, je perds les bénéfices de l’héritage, non ? Je veux que tout ce qui est défini dans la méthode <code>setUI</code> classe mère soit utilisé (là j’ai simplifié, mais ça inclue un <code>menuBar</code>, des actions diverses (qui ne devraient peut-être pas être dans la méthode <code>setUI</code>, mais c’était comme ça dans l’exemple que j’avais trouvé)). Je compte avoir plusieurs classes filles, donc tout recopier va dupliquer le code pas mal. Il est également possible que je m’y prenne entièrement mal.</p>
<blockquote>
<p>Je pense que la solution à privilégier serait d’appeler show en dehors de la classe</p>
<p>La meilleure façon serait en effet d’appeler show en dehors de ta classe.</p>
</blockquote>
<p>Donc quelque chose comme</p>
<div class="hljs-code-div"><div class="hljs-line-numbers"><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span></div><pre><code class="hljs language-py"><span class="hljs-keyword">import</span> sys
<span class="hljs-keyword">from</span> PyQt5.QtWidgets <span class="hljs-keyword">import</span> QMainWindow, QApplication, QAction, qApp, QWidget, QPushButton, QAction, QLineEdit, QMessageBox
<span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">Main</span><span class="hljs-params">(QMainWindow)</span>:</span>
<span class="hljs-function"><span class="hljs-keyword">def</span> <span class="hljs-title">__init__</span><span class="hljs-params">(self)</span>:</span>
super().__init__()
self.setUI()
<span class="hljs-function"><span class="hljs-keyword">def</span> <span class="hljs-title">setUI</span><span class="hljs-params">(self)</span>:</span>
self.setGeometry(<span class="hljs-number">100</span>,<span class="hljs-number">100</span>,<span class="hljs-number">1200</span>,<span class="hljs-number">800</span>)
self.setWindowTitle(<span class="hljs-string">'Fenêtre principale'</span>)
<span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">AddSentence</span><span class="hljs-params">(Main)</span>:</span>
<span class="hljs-function"><span class="hljs-keyword">def</span> <span class="hljs-title">__init__</span><span class="hljs-params">(self)</span>:</span>
super().__init__()
self.setUIAdd()
<span class="hljs-function"><span class="hljs-keyword">def</span> <span class="hljs-title">setUIAdd</span><span class="hljs-params">(self)</span>:</span>
self.translationField=QLineEdit(self)
self.translationField.move(<span class="hljs-number">400</span>,<span class="hljs-number">300</span>)
self.translationField.resize(<span class="hljs-number">400</span>,<span class="hljs-number">50</span>)
monApp=QApplication(sys.argv)
fenetre=AddSentence()
fenetre.show()
sys.exit(monApp.exec_())
</code></pre></div>
<p>Je n’ai pas testé (pas python ici), mais dans le principe, c’est ce que vous me conseillez ? Il va falloir que je réfléchisse plus longtemps que je ne le peux ici pour comprendre les implications sur la construction des actions qui changent l’affichage (valider le <code>translationField</code> par exemple, qui devrait remettre un champ vide, et afficher la phrase entrée en dessous), mais je vais le garder à l’esprit et faire des tests.</p>
<p>Et je pense comprendre que la solution à base de <code>mro</code> n’est pas bonne, mais je ne comprends toujours pas pourquoi j’ai une erreur. J’ai un sentiment que ça vient d’une différenciation classe/instance de la classe, mais honnêtement, je n’en sais rien.</p>
<p>Merci encore !</p>Exécuter un code dans la méthode __init__ d'une classe, mais pas pour sa fille, message #1952252018-12-19T09:46:47+01:00DonKnacki/@DonKnackihttps://zestedesavoir.com/forums/sujet/11791/executer-un-code-dans-la-methode-__init__-dune-classe-mais-pas-pour-sa-fille/?page=1#p195225<p>Bonjour </p>
<p>Juste une petite remarque à propos de la documentation
Si celle de PyQt ne te satisfait pas, n’hésites pas à aller sur celle de Qt. </p>
<p>Personnellement, je n’ai encore eu aucune difficulté pour "passer" du C++ en python: même nom de méthodes, souvent même types d’arguments (parfois on peut mettre du unicode lorsque la doc indique uniquement du QString)</p>Exécuter un code dans la méthode __init__ d'une classe, mais pas pour sa fille, message #1952202018-12-19T06:14:56+01:00Wizix/@Wizixhttps://zestedesavoir.com/forums/sujet/11791/executer-un-code-dans-la-methode-__init__-dune-classe-mais-pas-pour-sa-fille/?page=1#p195220<p>La meilleure façon serait en effet d’appeler <code>show</code> en dehors de ta classe. Une autre façon est de redéfinir <code>setUI</code> dans ta classe fille :</p>
<div class="hljs-code-div"><div class="hljs-line-numbers"><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span><span></span></div><pre><code class="hljs language-python"><span class="hljs-class"><span class="hljs-keyword">class</span> <span class="hljs-title">AddSentence</span><span class="hljs-params">(Main)</span>:</span>
<span class="hljs-function"><span class="hljs-keyword">def</span> <span class="hljs-title">__init__</span><span class="hljs-params">(self)</span>:</span>
super().__init__()
self.setUIAdd()
<span class="hljs-function"><span class="hljs-keyword">def</span> <span class="hljs-title">setUI</span><span class="hljs-params">(self)</span>:</span>
self.setGeometry(<span class="hljs-number">100</span>, <span class="hljs-number">100</span>, <span class="hljs-number">1200</span>, <span class="hljs-number">800</span>)
self.setWindowTitle(<span class="hljs-string">'Fenêtre principale'</span>)
<span class="hljs-function"><span class="hljs-keyword">def</span> <span class="hljs-title">setUIAdd</span><span class="hljs-params">(self)</span>:</span>
self.translationField = QLineEdit(self)
self.translationField.move(<span class="hljs-number">400</span>, <span class="hljs-number">300</span>)
self.translationField.resize(<span class="hljs-number">400</span>, <span class="hljs-number">50</span>)
self.show()
</code></pre></div>Exécuter un code dans la méthode __init__ d'une classe, mais pas pour sa fille, message #1952132018-12-18T23:57:12+01:00entwanne/@entwannehttps://zestedesavoir.com/forums/sujet/11791/executer-un-code-dans-la-methode-__init__-dune-classe-mais-pas-pour-sa-fille/?page=1#p195213<p>Je pense que la solution à privilégier serait d’appeler <code>show</code> en dehors de la classe, je ne trouve pas logique que la fenêtre s’affiche directement en instanciant l’objet.</p>
<p>Aussi, pourquoi avoir nommé ta méthode <code>setUIAdd</code> dans <code>AddSentence</code> et non <code>setUI</code> comme dans la classe mère ?</p>Exécuter un code dans la méthode __init__ d'une classe, mais pas pour sa fille, message #1951992018-12-18T21:14:37+01:00Rockaround/@Rockaroundhttps://zestedesavoir.com/forums/sujet/11791/executer-un-code-dans-la-methode-__init__-dune-classe-mais-pas-pour-sa-fille/?page=1#p195199<p>Je voudrais que la classe fille ait l’UI de la mère et la sienne. Mais il semble qu’après le premier <code>self.show()</code>, le reste soit ignoré (ou au moins, pas affiché). Du coup je voudrais que le <code>self.show()</code> de la mère soit utilisé si je fais</p>
<div class="hljs-code-div"><div class="hljs-line-numbers"><span></span></div><pre><code class="hljs language-py">fenetre=Main()
</code></pre></div>
<p>mais pas quand j’écris</p>
<div class="hljs-code-div"><div class="hljs-line-numbers"><span></span></div><pre><code class="hljs language-py">fenetre=AddSentence()
</code></pre></div>
<p>Est-ce plus clair ? Je voudrais ignorer des lignes, mais seulement quand elles proviennent d’un héritage.</p>Exécuter un code dans la méthode __init__ d'une classe, mais pas pour sa fille, message #1951972018-12-18T21:08:16+01:00informaticienzero/@informaticienzerohttps://zestedesavoir.com/forums/sujet/11791/executer-un-code-dans-la-methode-__init__-dune-classe-mais-pas-pour-sa-fille/?page=1#p195197<p>Je ne comprends pas très bien ton problème. Tu veux que la classe fille exécute du code en plus ?</p>