IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Python Discussion :

incompréhension instanciation classe


Sujet :

Python

  1. #1
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Août 2022
    Messages
    19
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Août 2022
    Messages : 19
    Par défaut incompréhension instanciation classe
    Bonjour,

    dans le cas général, lorsqu'on écrit :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    class A:
        def __init__(self,x,y):
            self.x = x
            self.y = y
    puis qu'on instancie la classe :
    , il n'y a pas de problème, on peut passer des paramètres en plus à la fonction __new__.

    En revanche, si j'écris:
    , puis par exemple : , cela ne fonctionne pas.
    Pourriez-vous m'éclairer ? Par avance merci !

  2. #2
    Expert confirmé
    Avatar de fred1599
    Homme Profil pro
    Lead Dev Python
    Inscrit en
    Juillet 2006
    Messages
    4 062
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Lead Dev Python
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2006
    Messages : 4 062
    Par défaut
    Hello,

    Dans quel tutoriel as-tu vu ce type d'écriture pour instancier une classe ?

    Pour instancier,

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    class A:
        def __init__(self, x, y):
            self.x = x
            self.y = y
     
    a = A(1, 2)
    l'autre instanciation, pourquoi le paramètre 1, il semble que tu n'initialises pas avec un paramètre !

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    class A:
        pass
     
    a = A()

  3. #3
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 832
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 832
    Billets dans le blog
    1
    Par défaut
    Bonjour
    Citation Envoyé par Rasko Voir le message
    il n'y a pas de problème, on peut passer des paramètres en plus à la fonction __new__.
    Pas de problème faut le dire vite. Ton __init__ n'est absolument pas pris en compte et les attributs x et y n'existent pas. Rajoute un simple print("ici") dans le __init__ et tu le verras. Et essaye print(a.x) et tu le verras encore mieux.
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  4. #4
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Août 2022
    Messages
    19
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Août 2022
    Messages : 19
    Par défaut
    Merci. Quand je dis pas de problème, je veux juste dire que je n'ai pas de message d'erreur. Je comprends bien que mon appel à __new__ ne déclenche pas l'appel de __init__ et qu'il n'y a donc pas d'initialisation de l'instance.

  5. #5
    Membre Expert
    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    1 540
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 1 540
    Par défaut
    __new__ créé une instance de classe, __init__ l'initialise;
    __new__ est implicitement appelé avant __init__ lors de l'instanciation classique d'une classe.
    Dans ton 1er cas, il faut appeler aussi a.__init__(1,2) pour initialiser les variables a.x et a.y, sinon elles n'existent pas.
    La succession des 2 se fait quand on instancie par a=A(1,2) classiquement.

  6. #6
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 741
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 741
    Par défaut
    Salut,
    Citation Envoyé par Rasko Voir le message
    Pourriez-vous m'éclairer ? Par avance merci !
    On n'est pas supposé appeler __new__ ou __init__ directement: ce sont des points d'entrées que le système Python nous offre pour modifier la création et l'initialisation d'une instance par défaut.
    Ce qui fait que l'effet de bord des paramètres déclarés pour __init__ qui altèrent les paramètres acceptés par __new__ mérite peut être d'être signalé aux développeurs mais vous trouver un bon tuto devrait être votre priorité.

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  7. #7
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Août 2022
    Messages
    19
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Août 2022
    Messages : 19
    Par défaut
    Je travaille à partir du livre Le petit python orienté objet de Richard Gomez. J'ai lu (et pratiqué) la quasi totalité des chapitres. Il s'agit d'une deuxième lecture et j'essaye de comprendre plus précisément, c'est tout.

  8. #8
    Expert confirmé Avatar de papajoker
    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2013
    Messages
    2 323
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nièvre (Bourgogne)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Septembre 2013
    Messages : 2 323
    Par défaut
    bonjour

    Si tu recherches des exemples avec __new__, il y déjà pas mal de chose dans le code python (celui de (typing.py)NamedTupleMeta est particulier)
    https://github.com/python/cpython/se...thon&q=__new__

  9. #9
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Août 2022
    Messages
    19
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Août 2022
    Messages : 19
    Par défaut
    Merci beaucoup !

  10. #10
    Expert confirmé
    Avatar de fred1599
    Homme Profil pro
    Lead Dev Python
    Inscrit en
    Juillet 2006
    Messages
    4 062
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Lead Dev Python
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2006
    Messages : 4 062
    Par défaut
    Citation Envoyé par Rasko Voir le message
    Je travaille à partir du livre Le petit python orienté objet de Richard Gomez. J'ai lu (et pratiqué) la quasi totalité des chapitres. Il s'agit d'une deuxième lecture et j'essaye de comprendre plus précisément, c'est tout.
    Je ne connais pas ce livre, ni les tenants et aboutissants du chapitre que vous lisez, mais l'instanciation et la manière dont je vous la présente avec des exemples et la seule bonne manière de le faire.

    Soit vous relisez votre chapitre et exprimez sur ce forum l'objectif en utilisant cette manière de faire, soit je vous suggère de prendre en compte mes conseils pour instancier une classe.

    Mais à mon sens un livre ou un tutoriel de bonne facture ne donne pas ce type de démarche sans en préciser l'intérêt...

    À vous d'ajouter des détails sur les réels besoins de comprendre la syntaxe indiquée dans votre 1er message.

  11. #11
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Août 2022
    Messages
    19
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Août 2022
    Messages : 19
    Par défaut
    Je ne souhaitais froisser personne. L'auteur ne dit pas que l'on instancie une classe de cette manière, je me suis mal fait comprendre. Je relisais le chapitre 7 (méthodes pour instancier). Je vous mets en pièce-jointe quelques extraits du passage que je lis.Nom : Capture d’écran 2023-04-19 à 21.04.27.png
Affichages : 121
Taille : 651,4 KoNom : Capture d’écran 2023-04-19 à 21.04.44.png
Affichages : 122
Taille : 515,4 KoNom : Capture d’écran 2023-04-19 à 21.05.02.png
Affichages : 124
Taille : 640,3 Ko

  12. #12
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 832
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 832
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par Rasko Voir le message
    Je ne souhaitais froisser personne.
    Tu n'as froissé personne. Enfin si un peu quand-même en allant acheter un bouquin à 42€ alors qu'il y en a tant de gratuits sur le net (y compris dans ma signature)...
    Citation Envoyé par Rasko Voir le message
    L'auteur ne dit pas que l'on instancie une classe de cette manière, je me suis mal fait comprendre.
    J'ai lu ta page. En fait tu ne t'es pas mal fait comprendre, c'est toi qui n'a pas bien compris. L'auteur dit que quand on instancie une classe, Python fait plein d'opérations internes dont un appel à __new__(). Tu as le droit si tu en as envie de faire ces opérations manuellement mais
    • en les faisant correctement
    • en les faisant entièrement

    Si tu rates une des deux étapes, vu que Python n'a pas été prévu pour gérer le cas d'un type préférant faire les choses manuellement (au lieu de laisser faire le langage) et qu'en plus il se plante ("il" c'est "le type", pas Python!!!), Python sort au final un truc bancal. Après tu peux venir demander "pourquoi c'est bancal" mais la seule réponse c'est "comportement indéterminé".

    Donc voici un exemple d'instanciation détaillée
    Code python : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    class A:
    	def __init__(self, x):
    		self.x=x
     
    toto=object.__new__(A)
    toto.__init__(5)
    print(toto.x)

    Voici le même exemple écrit de façon encore plus immonde (ben oui, tant qu'à faire...)
    Code python : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    class A:
    	def __init__(self, x):
    		self.x=x
     
    A.__init__(toto:=object.__new__(A), 5)
    print(toto.x)

    Et voici le même exemple écrit de façon plus classique (je voulais utiliser l'adjectif "normale" mais cela aurait induit un jugement de valeur pas forcément partagé)
    Code python : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    class A:
    	def __init__(self, x):
    		self.x=x
     
    toto=A(5)
    print(toto.x)
    Personnellement je sais quelle écriture je préfères. Après chacun ses goûts...
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  13. #13
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Août 2022
    Messages
    19
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Août 2022
    Messages : 19
    Par défaut
    Merci encore pour ces explications.

Discussions similaires

  1. Instanciation classe abstraite
    Par phoenixgreg dans le forum Langage
    Réponses: 3
    Dernier message: 08/09/2015, 18h40
  2. Instanciation classe sur le serveur
    Par olibara dans le forum Windows Communication Foundation
    Réponses: 9
    Dernier message: 20/05/2010, 13h32
  3. Instancier classes et attributs à partir de leur nom
    Par Vakhyw dans le forum Débuter
    Réponses: 1
    Dernier message: 10/08/2009, 18h55
  4. Réponses: 3
    Dernier message: 15/04/2008, 14h40
  5. probleme instanciation classe
    Par gorgonite dans le forum Général JavaScript
    Réponses: 1
    Dernier message: 13/09/2006, 20h52

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo