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 :

Point d'incompréhension sur les class


Sujet :

Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre régulier
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2019
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2019
    Messages : 7
    Par défaut Point d'incompréhension sur les class
    Bien le bonjour.
    Je suis actuellement le cour "Apprendre à programmer avec Python 3" de Gérard Swinnen.
    J'en suis au chapitre 14 "Classes, méthodes, héritage".
    Mais il y a quelque chose que je ne comprend pas, même 2.
    Prenez le code suivant:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
     
    class Atome:
    	"""atomes simplifiés, choisis parmi les 10 premiers éléments du TP"""
    	table = [None, ('hydrogène', 0), ('hélium', 2), ('lithium', 4),
    			 ('béryllium', 5), ('bore', 6), ('carbone', 6), ('azote', 7),
    			 ('oxygène', 8), ('fluor', 10), ('néon', 10)]
     
    	def __init__(self, nat):
    		"le n° atomique détermine le n. de protons, d'électrons et de neutrons"
    		self.np, self.ne = nat, nat  # nat = numéro atomique
    		self.nn = Atome.table[nat][1]                             #ICI
     
    	def affiche(self):
    		print()
    		print("Nom de l'élément :", Atome.table[self.np][0])
    		print("%s protons, %s électrons, %s neutrons" % \
    			  (self.np, self.ne, self.nn))
     
     
    class Ion(Atome):
    	"""les ions sont des atomes qui ont gagné ou perdu des électrons"""
     
    	def __init__(self, nat, charge):
    		"le n° atomique et la charge électrique déterminent l'ion"
    		Atome.__init__(self, nat)                #ET LA
    		self.ne = self.ne - charge
    		self.charge = charge
     
    	def affiche(self):
    		Atome.affiche(self)
    		print("Particule électrisée. Charge =", self.charge)
     
     
    ### Programme principal : ###
     
    a1 = Atome(5)
    a2 = Ion(3, 1)
    a3 = Ion(8, -2)
    a1.affiche()
    a2.affiche()
    a3.affiche()
    Premièrement, pourquoi à la ligne 11, il y a écrit:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    self.nn = Atome.table[nat][1]
    au lieu de:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    self.nn = self.table[nat][1]
    Voila, c'est mon premier point d'incompréhension.
    Le deuxieme se situe à la ligne 25:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Atome.__init__(self, nat)
    Je ne comprend pas vraiment ce qu'il se passe.
    On ne stocke le résultat nul part.

    Voila, merci d'avance, j'espère que vous pourrez m'éclairer.

  2. #2
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 744
    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 744
    Par défaut
    Salut,

    Citation Envoyé par Nathanmart95 Voir le message
    Premièrement, pourquoi à la ligne 11, il y a écrit:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    self.nn = Atome.table[nat][1]
    au lieu de:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    self.nn = self.table[nat][1]
    Techniquement, c'est la même chose... du moins tant qu'on accède à l'attribut "table" en lecture, il prendra celui qu'il trouve. Ça met juste l'emphase que table est un attribut de la classe Atome et non de l'instance.


    Citation Envoyé par Nathanmart95 Voir le message
    Le deuxieme se situe à la ligne 25:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Atome.__init__(self, nat)
    Je ne comprend pas vraiment ce qu'il se passe.
    On ne stocke le résultat nul part.
    C'est juste un appel de l'__init__ du parent pour que les attributs du parent soient aussi créées et parce que en déclarant votre propre __init__, vous "surchargez" la méthode parente. Dans certains cas, "surcharger" peut être remplacer... Mais dans le cas d'une initialisation, il faut que chaque classe puisse faire son boulot.

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

  3. #3
    Membre régulier
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2019
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2019
    Messages : 7
    Par défaut
    Citation Envoyé par wiztricks Voir le message
    Salut,



    Techniquement, c'est la même chose... du moins tant qu'on accède à l'attribut "table" en lecture, il prendra celui qu'il trouve. Ça met juste l'emphase que table est un attribut de la classe Atome et non de l'instance.




    C'est juste un appel de l'__init__ du parent pour que les attributs du parent soient aussi créées et parce que en déclarant votre propre __init__, vous "surchargez" la méthode parente. Dans certains cas, "surcharger" peut être remplacer... Mais dans le cas d'une initialisation, il faut que chaque classe puisse faire son boulot.

    - W
    Merci,
    Je crois avoir compris la première chose. J'ai fait quelque recherche, et si j'ai bien compris, je peux en théorie acceder à la variable table sans créer d'instance?
    Juste en faisant Atome.table n'importe où dans le texte?

    Et pour le deuxième, si j'ai bien compris, c'est une manière d'ajouter toutes les variables du __init__ d'Atome dans Ion?

    Edit: Mais dans ce cas là, pourquoi indiquer "class Ion(Atome)", j'ai essayer "class Ion()", et tout fonctionnais bien.

  4. #4
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 744
    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 744
    Par défaut
    Citation Envoyé par Nathanmart95 Voir le message
    Edit: Mais dans ce cas là, pourquoi indiquer "class Ion(Atome)", j'ai essayer "class Ion()", et tout fonctionnais bien.
    Parce qu'en écrivant:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    class Ion(Atome):
    	"""les ions sont des atomes qui ont gagné ou perdu des électrons"""
     
    	def __init__(self, nat, charge):
    		"le n° atomique et la charge électrique déterminent l'ion"
    		Atome.__init__(self, nat)                #ET LA
    		self.ne = self.ne - charge
    		self.charge = charge
     
    	def affiche(self):
    		Atome.affiche(self)
    		print("Particule électrisée. Charge =", self.charge)
    Atome.__init__ et Atome.affiche sont de simples fonctions auxquelles vous passez un argument. Vous faites un héritage "manuel".
    Si vous l'écriviez "normalement" ce serait super().__init__(....) et super().affiche(): la c'est Python qui va chercher quoi appeler dans les classes parentes. Ce qui peut être intéressant car si Ion hérite d'Atome, vous ne savez pas de quoi hérite Atome, ni si affiche est une méthode d'Atome ou d'un de ses parents.

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

  5. #5
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 835
    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 835
    Billets dans le blog
    1
    Par défaut
    Bonjour
    Citation Envoyé par Nathanmart95 Voir le message
    Je crois avoir compris la première chose. J'ai fait quelque recherche, et si j'ai bien compris, je peux en théorie acceder à la variable table sans créer d'instance?
    Juste en faisant Atome.table n'importe où dans le texte?
    C'est exact. C'est ce qu'on nomme un "attribut de classe". C'est à dire une variable qui est commune à toutes les instances. Pratique pour positionner des éléments de travail immuables et communs dans une classe. On peut même faire une analogie illustrative entre "variables globales" et "varibales locales".

    Et en plus, cela ne t'interdit pas de créer un attribut de l'instance portant le même nom que l'attribut de classe. Dans ce cas, l'attribut "local" prend le pas sur le "global".

    Exemple
    Code python : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    >>> class toto(object):
    ...	var=123
    ...
    >>> toto.var
    123
    >>> id(toto.var)			# id=identifiant (on peut métaphoriquement l'assimiler à "adresse de")
    500000    # par exemple
    >>> a=toto()
    >>> a.var
    123
    >>> id(a.var)
    500000    # le même
    >>> a.var=456
    >>> a.var
    456
    >>>
    >>> id(a.var)
    600000    # plus le même
    >>> toto.var
    123

    Citation Envoyé par Nathanmart95 Voir le message
    Et pour le deuxième, si j'ai bien compris, c'est une manière d'ajouter toutes les variables du __init__ d'Atome dans Ion?
    C'est ce qu'on appelle "l'héritage". Dans beaucoup de langages objet, l'héritage est implicite, mais en Python on est obligé de l'expliciter.

    wiztricks a d'ailleurs mentionné la méthode super() qui est de loin préférable. En effet, en cas d'héritage multiple (C qui hérite de A et B), on ne se pose pas de question comme "lequel vais-je mettre en premier". On appelle juste super() et on laisse le MRO (Method Resolution Order) se démerder (MRO qu'on peut même modifier manuellement si besoin).
    Ainsi la syntaxe initiale objet_herite.methode(self, arguments) devient super(objet_courant, self).methode(arguments) ce qui donne ici ta ligne 11 Atome.__init__(self, nat) qui deviendra super(Ion, self).__init__(nat). Et en Python3, on n'est même plus obligé de préciser "objet_courant" en premier argument car comme c'est toujours lui c'est devenu implicite.
    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]

  6. #6
    Membre éclairé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2018
    Messages
    41
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2018
    Messages : 41
    Par défaut
    Citation Envoyé par Sve@r Voir le message
    C'est exact. C'est ce qu'on nomme un "attribut de classe". C'est à dire une variable qui est commune à toutes les instances. Pratique pour positionner des éléments de travail immuables et communs dans une classe.
    Salut,
    Comme modeste contribution, j'ajoute que les attributs de classe sont très pratiques pour conserver les éléments de contexte communs à toute l'application, comme par exemple une connexion à une base de données. Il suffit que chacune des classes hérite de la classe contenant le contexte, et le tour est joué.
    Par ailleurs, il faut garder à l'esprit que le code présent dans la classe, immédiatement après la définition de celle-ci et avant toute autre méthode, est exécuté une et une fois seulement lors de la définition de la classe.

  7. #7
    Membre régulier
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2019
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2019
    Messages : 7
    Par défaut
    He bien merci beaucoup à tous, vous avez éclairé mon chemin.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Je débute en haskell, incompréhension sur les classes
    Par NokyDaOne dans le forum Haskell
    Réponses: 6
    Dernier message: 24/08/2008, 21h13
  2. [COM] informations sur les classes
    Par gorgonite dans le forum Visual C++
    Réponses: 3
    Dernier message: 12/12/2006, 14h31
  3. [POO] Besoin de tutorat sur les classes
    Par misterniark dans le forum Langage
    Réponses: 11
    Dernier message: 20/04/2006, 13h48
  4. demande de renseignements sur les classes
    Par altadeos dans le forum Langage
    Réponses: 4
    Dernier message: 08/04/2006, 15h59
  5. Question de base sur les classes
    Par deaven dans le forum C++
    Réponses: 3
    Dernier message: 27/11/2005, 16h20

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