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 :

Question technique sur les classes et héritages


Sujet :

Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    sans
    Inscrit en
    Avril 2016
    Messages
    18
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : sans

    Informations forums :
    Inscription : Avril 2016
    Messages : 18
    Par défaut Question technique sur les classes et héritages
    Bonjour,

    Voila j'ai un petit soucis de comprehension...
    "page" hérite de "data_read" qui hérite de "gestion" jusque la pas de soucis tout fonctionne mais ma question est comment ça peut fonctionner alors que "data_read" ne doit normalement pas acceder aux fonctions de "page" puisqu'elle est mere de "page" et pourtant lorsque je fais la fonction "read()", "data_read" modifie bien le grid_data !!! Comment cela est ce possible ? Cela voudrais dire qu'en python la classe mère peut accéder a tout ce que possède la classe fille ? Merci pour vos réponse éclairée ;o)

    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
     
    class gestion(object):
    	def __init__(self, master):
    		self.master = master
     
    class data_read(gestion):
    	def __init__(self, master):
    		gestion.__init__(self, master)
     
    	def read(self, search=None):
    		self.grid_data.insert(item[0], it, 'inactif')
     
    class page(data_read):
    	def __init__(self, master, parent=None):
    		data_read.__init__(self, master)
    		# insertion du mon widget data_grid
    		self.grid_data = data_grid()
    		self.read()

  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
    Les classes filles héritent de l'ensemble des méthodes et attributs de la classe mère, donc oui, la classe fille page hérite bien de la méthode de la classe mère data_read.

  3. #3
    Membre averti
    Homme Profil pro
    sans
    Inscrit en
    Avril 2016
    Messages
    18
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : sans

    Informations forums :
    Inscription : Avril 2016
    Messages : 18
    Par défaut
    En fait que qui me dérange c'est que la classe mère ait accès a un widget dans la class fille, elle le reconnait. Dans l'exemple ci dessous c'est peut être plus parlant.
    "self.grid_data" appartient a la classe fille. Faire appel aux fonctions de la classe mère c'est normal puisque c'est le but mais comment ça se fait que si je lance read() cela me modifie bien la valeur de "grid_data" de la classe fille mon résultat est "2".


    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
     
    class data_read(gestion):
    	def __init__(self, master):
    		gestion.__init__(self, master)
    		self.grid_data = 3
     
    	def read(self, search=None):
    		self.grid_data = 2
     
    class page(data_read):
    	def __init__(self, master, parent=None):
    		data_read.__init__(self, master)
    		# insertion du mon widget data_grid
    		self.grid_data = 1
    		self.read()
     
    		print(self.grid_data)

  4. #4
    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
    Bah toujours pareil, grid_data est un attribut de la classe mère. Le but dans la classe fille est de modifier le comportement des attributs et méthodes de la classe mère. Donc tout est encore normal sur ce coup !

    Je t'explique ci-dessous les valeurs modifiées de l'attribut a de la classe mère

    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
    class A:    
        def __init__(self):
            self.a = 2
        def read(self):
            self.a = 3
     
     
    class B(A):
        def __init__(self):
            super().__init__() # self.a = 2
            self.a = 1 # self.a = 1
        def __str__(self):
            self.read() # self.a = 3
            return str(self.a)
     
     
    b = B()
    print(b) # 3

  5. #5
    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 attila_49 Voir le message
    "self.grid_data" appartient a la classe fille. Faire appel aux fonctions de la classe mère c'est normal puisque c'est le but mais comment ça se fait que si je lance read() cela me modifie bien la valeur de "grid_data" de la classe fille mon résultat est "2".
    Ce ne sera qu'à partir du moment où sera exécutée une assignation self.grid_data = qqc que grid_data deviendra un des attributs de l'instance. Avant, il n'existe pas.
    Et il devient attribut de l'instance à cause du "self": l'espace de nom dans lequel il sera créer/mis à jour par l'assignation.... Il est "unique" et il ne disparaîtra que lors de la destruction de l'instance.

    Dans une chaîne d'héritage (A hérite de B qui hérite de C), on pourrait avoir un attribut dit de classe toto définit pour chaque classe.... mais c'est autre chose qu'un attribut d'instance.

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

  6. #6
    Membre averti
    Homme Profil pro
    sans
    Inscrit en
    Avril 2016
    Messages
    18
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : sans

    Informations forums :
    Inscription : Avril 2016
    Messages : 18
    Par défaut
    Oui en fait comme le disait papajoker il n'existe pas de système de private en python sinon la classe mère ne pourrait pas atteindre les valeurs de la classe enfant.
    Merci a tous pour vos réponses éclairées ;o)

  7. #7
    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
    il n'existe pas de système de private en python
    Syntaxiquement si, mais elles ne sont pas représentatives des autres langages comme par exemple Java et C++.

    En python, on utilise la syntaxe __variable (note les double underscore avant variable) pour prévenir les conflits entre classe parente et classes filles. C'est un genre d'obscurcissement !

    Il me semble dans mes souvenirs, que la PEP8 indique que ce genre de syntaxe ne devrait pas être très souvent utilisé sauf à des fins comme défini ci-dessus...

  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
    Citation Envoyé par attila_49 Voir le message
    Bonjour,
    "data_read" ne doit normalement pas acceder aux fonctions de "page" puisqu'elle est mere de "page"
    "normalement" pour toi ou pour python ? En python il n'existe pas de notion de privé/protected

  9. #9
    Membre averti
    Homme Profil pro
    sans
    Inscrit en
    Avril 2016
    Messages
    18
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : sans

    Informations forums :
    Inscription : Avril 2016
    Messages : 18
    Par défaut
    Ok, merci pour la réponse. Je programmais avant dans d'autres langages, je ne connais pas encore toutes les subtilités de ce langage ;o)

Discussions similaires

  1. [AC-2002] Question rapide sur les classes
    Par zak_mckraken dans le forum VBA Access
    Réponses: 3
    Dernier message: 15/01/2010, 17h56
  2. Réponses: 7
    Dernier message: 02/01/2008, 14h32
  3. Question débutant sur les classes
    Par oranoutan dans le forum Windows Forms
    Réponses: 5
    Dernier message: 29/05/2007, 11h25
  4. Question technique sur les listes déroulantes
    Par kenny49 dans le forum Langage
    Réponses: 3
    Dernier message: 18/04/2007, 10h41
  5. Question techniques sur les extents
    Par lecharcutierdelinux dans le forum Oracle
    Réponses: 16
    Dernier message: 24/08/2006, 09h01

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