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 :

super() inhabituel et chelou


Sujet :

Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre actif
    Homme Profil pro
    Chômeur professionnel
    Inscrit en
    Novembre 2020
    Messages
    122
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Algérie

    Informations professionnelles :
    Activité : Chômeur professionnel

    Informations forums :
    Inscription : Novembre 2020
    Messages : 122
    Par défaut super() inhabituel et chelou
    Wesh les mecs,

    à force de faire des test A/B, je suis tombé sur ce code. Certes, c'est de la masturbation intellectuelle, mais ça me casse les bonbons de pas comprendre.
    Jvous explique: dans ma tête, on utilise un super() dans une subclass pour faire "descendre" des attributs de la superclass. Jsuis pas programmeur mais je pense que c'est l'usage le plus courant et surtout le plus intuitif. En plus, je suppose qu'une valeur au moins est toujours introduite quand on appelle les attributs à partir de l'objet.
    Dans mon exemple 1, lorsqu'on fait descendre la valeur True de la superclass, elle est overriden par False de la subclass. Or, moi je pensais que True de la superclass était appelé directement par la ligne super() sans passer par les paramètres de la subclass. Apparemment, c'est pas le cas.
    Et dans l'exemple 2, super() vient directement récupérer la valeur True de la superclass, sans passer par les paramètres de la subclass. C'est l'inverse. Pourtant c'est quasi la même structure.
    C'est un bordel cette affaire.

    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
     
    # 1
    class A:
    	def __init__(self, value = True):
    		print(value)
     
    class B(A):
    	def __init__(self, value = False):
    		super().__init__(value)
    		print(value)
     
    b = B() # False False
     
     
    # 2
    class A:
    	def __init__(self, value):
    		self.value = value = True
    		print(value)
     
    class B(A):
    	def __init__(self, value = False):
    		super().__init__(value)
    		print(value)
     
     
    b = B() # True False

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

    Citation Envoyé par Yuseph Voir le message
    Et dans l'exemple 2, super() vient directement récupérer la valeur True de la superclass, sans passer par les paramètres de la subclass. C'est l'inverse. Pourtant c'est quasi la même structure.
    Avant de jouer avec les class, il serait sage d'apprendre les différents passages de paramètres qu'acceptent les fonctions car là vous êtes juste en train de vous faire un sac de noeuds avec ce qu'on appelle "valeurs par défaut".

    Dans le tuto. qui vient avec Python vous avez tout un chapitre là dessus.

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

  3. #3
    Expert confirmé

    Homme Profil pro
    Inscrit en
    Octobre 2008
    Messages
    4 307
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2008
    Messages : 4 307
    Par défaut
    Salut,

    Je ne comprends pas ceci:
    Et dans l'exemple 2, super() vient directement récupérer la valeur True de la superclass
    super ne récupère rien du tout, il passe la valeur True en argument or cette valeur est ignorée et remplacée par self.value = value = True.

    Ceci le montre:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    class A:
        def __init__(self, value):
            self.value = value = True
            print(value)
     
    class B(A):
        def __init__(self, value = False):
            super().__init__(value)
            print(value)
            print(self.value)
     
    b = B()

  4. #4
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 837
    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 837
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par Yuseph Voir le message
    Jvous explique: dans ma tête, on utilise un super() dans une subclass pour faire "descendre" des attributs de la superclass.
    Non, on utilise super() simplement pour bénéficier des actions de la classe mère. C'est ce qu'on nomme la "délégation". Si la classe mère fait "truc" et que tu veux que ta classe en hérite en y rajoutant ton "chose", il te faut appeler explicitement ce "truc" car contairement aux autres langages qui savent gérer l'objet, cela n'est pas fait automatiquement.
    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
    class parent:
    	def trucA(self):
    		print("parent: je fais trucA")
    	def trucB(self):
    		print("parent: je fais trucB")
     
    class enfant(parent):
    	def trucB(self):
    		super().trucB()
    		print("enfant: je fais des trucB en plus")
     
    x=enfant()
    x.trucA()
    x.trucB()
    Etant donné que "enfant" ne surcharge pas "trucA()", elle en hérite naturellement. Mais comme elle surcharge "trucB()" alors si on veut bénéficier du trucB() du parent il faut l'appeler explicitement.

    Citation Envoyé par Yuseph Voir le message
    En plus, je suppose qu'une valeur au moins est toujours introduite quand on appelle les attributs à partir de l'objet.
    Oui, sa propre instance.

    Citation Envoyé par Yuseph Voir le message
    Dans mon exemple 1, lorsqu'on fait descendre la valeur True de la superclass, elle est overriden par False de la subclass. Or, moi je pensais que True de la superclass était appelé directement par la ligne super() sans passer par les paramètres de la subclass. Apparemment, c'est pas le cas.
    J'ai l'impression que tu raisonnes à l'envers. Ce n'est pas la superclass qui "descend" vers la subclass, c'est la subclass qui appelle la superclass pour lui faire faire un travail qu'elle n'aura ainsi pas besoin d'implémenter.
    Dans ton exemple, tu instancies B() sans lui passer de valeur. Elle prend donc la valeur par défaut (False). Puis elle appelle la superclass en lui passant cette valeur (False). Comme cette valeur False est explicitement donnée, la valeur par défaut de la superclass n'est alors pas prise en considération et c'est cette valeur False qui est affichée.

    Citation Envoyé par Yuseph Voir le message
    Et dans l'exemple 2, super() vient directement récupérer la valeur True de la superclass, sans passer par les paramètres de la subclass. C'est l'inverse. Pourtant c'est quasi la même structure.
    Ben oui mais là tu forces explicitement le paramètre à être à True. En fait, le paramètre devient inutile.

    Citation Envoyé par Yuseph Voir le message
    C'est un bordel cette affaire.
    Peut-être voir ici...
    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]

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

    Informations forums :
    Inscription : Septembre 2010
    Messages : 1 545
    Par défaut
    Citation Envoyé par Yuseph Voir le message
    Wesh les mecs,

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    # 1
    class A:
    	def __init__(self, value = True):
    		print(value)
     
    class B(A):
    	def __init__(self, value = False):
    		super().__init__(value)
    		print(value)
     
    b = B() # False False
    Tu instancies un objet de classe B, sans passer de valeur, donc value de classe B prend la valeur par défaut False. Tu appelles ensuite la fonction __ini__() de la classe mère A avec value=False, donc ça t'affiche False, et idem ensuite à la fin de l'init de la classe B.

    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
     
     
    # 2
    class A:
    	def __init__(self, value):
    		self.value = value = True
    		print(value)
     
    class B(A):
    	def __init__(self, value = False):
    		super().__init__(value)
    		print(value)
     
     
    b = B() # True False
    même début, objet de classe B avec la valeur par défaut , donc value=False; puis appel à __init__ de la classe mère A avec le paramètre value. Dans l'init de la classe A, tu mets self.value et value (variable locale) à True, et tu affiches donc True; de retour dans l'init de la classe B, le valeur de celle-ci vaut toujours False, donc on affiche False.

Discussions similaires

  1. Font "times new roman" super moche avec mdk 9.2
    Par shkyo dans le forum Mandriva / Mageia
    Réponses: 6
    Dernier message: 15/04/2004, 18h34
  2. ORDER BY dans un ordre inhabituel
    Par Riam dans le forum SQL Procédural
    Réponses: 2
    Dernier message: 21/03/2003, 13h29

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