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 :

Comment connaitre le type de l'objet courant


Sujet :

Python

  1. #1
    Membre éclairé Avatar de Bayard
    Inscrit en
    Juin 2002
    Messages
    863
    Détails du profil
    Informations forums :
    Inscription : Juin 2002
    Messages : 863
    Par défaut Comment connaitre le type de l'objet courant
    J'ai deux sous-classes sous-classe A et sous-classe B qui héritent de la classe "Mère".

    J'aimerais, dans le code de la classe "Mère", pouvoir tester le type d'instance de l'objet courant
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    isinstance(jenesaispasquoimettre, "A")
    ou
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    isinstance(jenesaispasquoimettre, "B")
    Est-ce possible ?
    Que dois passer en premier paramètre de la fonction isinstance() ?

  2. #2
    Membre Expert
    Homme Profil pro
    Inscrit en
    Octobre 2011
    Messages
    2 910
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Octobre 2011
    Messages : 2 910
    Par défaut
    Salut,

    La syntaxe est la suivante : isinstance(object, type)...

    Exemple : isinstance(3, int) revoie true car 3 est bien un entier...

  3. #3
    Membre éclairé Avatar de Bayard
    Inscrit en
    Juin 2002
    Messages
    863
    Détails du profil
    Informations forums :
    Inscription : Juin 2002
    Messages : 863
    Par défaut
    Merci, mais je connais cette fonction et sa syntaxe.
    Ma question est, dans le cas particulier où
    j'ai deux sous-classes sous-classe A et sous-classe B qui héritent de la classe "Mère".

    J'aimerais, dans le code de la classe "Mère", pouvoir tester le type d'instance de l'objet courant

    Peut être est-ce self ?

  4. #4
    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 Bayard Voir le message
    Ma question est, dans le cas particulier où
    j'ai deux sous-classes sous-classe A et sous-classe B qui héritent de la classe "Mère".

    J'aimerais, dans le code de la classe "Mère", pouvoir tester le type d'instance de l'objet courant

    Peut être est-ce self ?
    Oui c'est bien self qui référence l'objet courant mais c'est inutile. Dans la classe "Mère", le test isinstance(self, Mere) sera toujours vrai, même si l'objet est "A". C'est parce que isinstance() teste non seulement si l'objet mais teste aussi si son arbre d'héritage est de ce type.
    Donc si "A" hérite de "Mere", alors tout objet "A" est aussi de type "Mere".

    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
    #!/usr/bin/env python3
    # coding: utf-8
     
    class Mere(object):
    	def test(self):
    		print("mere:",  type(self), isinstance(self, Mere))
     
    class A(Mere):
    	def test(self):
    		super().test()
    		print("a:",  type(self), isinstance(self, A))
     
     
    a=A()
    a.test()
    Affiche "True" aux deux tests...
    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 éclairé Avatar de Bayard
    Inscrit en
    Juin 2002
    Messages
    863
    Détails du profil
    Informations forums :
    Inscription : Juin 2002
    Messages : 863
    Par défaut
    merci

  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 Bayard Voir le message
    Est-ce possible ?
    Que dois passer en premier paramètre de la fonction isinstance() ?
    Sauf que la classe "mère" n'a aucune raison de savoir le nom des classes qui en héritent. Ce qui veut dire mettre à jour la classe mère à chaque nouvelle classe qui va en hériter alors que si on a inventé l'héritage, c'est justement pour éviter çà.

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

  7. #7
    Membre éclairé Avatar de Bayard
    Inscrit en
    Juin 2002
    Messages
    863
    Détails du profil
    Informations forums :
    Inscription : Juin 2002
    Messages : 863
    Par défaut
    Citation Envoyé par wiztricks Voir le message
    Salut,

    Sauf que la classe "mère" n'a aucune raison de savoir le nom des classes qui en héritent. Ce qui veut dire mettre à jour la classe mère à chaque nouvelle classe qui va en hériter alors que si on a inventé l'héritage, c'est justement pour éviter çà.

    - W
    Dans mon cas, j'ai environ 10 sous-classes avec un comportement et une sous-classe avec un autre comportement, l'idée est d'éviter de dupliquer du code dans 10 sous-classes.

  8. #8
    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 Bayard Voir le message
    Dans mon cas, j'ai environ 10 sous-classes avec un comportement et une sous-classe avec un autre comportement, l'idée est d'éviter de dupliquer du code dans 10 sous-classes.
    Intégrez la méthode commune aux 10 classes dans la classe mère ou créez une s/classe de la classe "mère" en surchargeant cette méthode là. Et vos 10 classes héritent de cette s/classe.

    La s/classe qui a un autre comportement héritera quant à elle directement de la classe mère en surchargeant la méthode qui est différente.

    Au bout du compte, le code n'a pas été dupliqué.

    Un des intérêts de l'héritage est d'éviter les if ... then ... else... pour "spécialiser" le code dans des s/classe avec surcharge.

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

  9. #9
    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 Bayard Voir le message
    Dans mon cas, j'ai environ 10 sous-classes avec un comportement et une sous-classe avec un autre comportement, l'idée est d'éviter de dupliquer du code dans 10 sous-classes.
    Malgré que tu expliques pourquoi cela, j'ai des doutes sur la conception de ton projet, mais pour le coup tu as étayée ma curiosité

    Ça serait bien que tu nous mettes dans le contexte si tu le souhaites, histoire de voir si on peut pas proposer une solution plus adéquate à ton problème de départ.

  10. #10
    Membre éclairé Avatar de Bayard
    Inscrit en
    Juin 2002
    Messages
    863
    Détails du profil
    Informations forums :
    Inscription : Juin 2002
    Messages : 863
    Par défaut
    Citation Envoyé par wiztricks Voir le message
    Salut,



    Intégrez la méthode commune aux 10 classes dans la classe mère ou créez une s/classe de la classe "mère" en surchargeant cette méthode là. Et vos 10 classes héritent de cette s/classe.

    La s/classe qui a un autre comportement héritera quant à elle directement de la classe mère en surchargeant la méthode qui est différente.

    Au bout du compte, le code n'a pas été dupliqué.

    Un des intérêts de l'héritage est d'éviter les if ... then ... else... pour "spécialiser" le code dans des s/classe avec surcharge.

    - W
    Vous avez raison, j'avais oublié ma surcharge.

  11. #11
    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 Bayard Voir le message
    Vous avez raison, j'avais oublié ma surcharge.
    C'est exactement ce que j'ai fait avec la méthode "test()" de mon exemple

    Petit rajout illustratif...

    Code python : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    class B(Mere): pass
     
    b=B()
    b.test()
    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]

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

Discussions similaires

  1. Connaitre le type d'un objet
    Par slydemusli dans le forum Access
    Réponses: 5
    Dernier message: 18/08/2006, 11h31
  2. Réponses: 21
    Dernier message: 25/06/2006, 02h31
  3. Comment connaitre le type d'un attribut dans une table?
    Par Abdou_9002 dans le forum Bases de données
    Réponses: 1
    Dernier message: 02/03/2006, 10h07
  4. [POO] Comment connaître le type d'un objet
    Par zizou39 dans le forum Général JavaScript
    Réponses: 3
    Dernier message: 01/03/2005, 09h46
  5. Comment detecter le type d'un objet?
    Par nickylarson dans le forum C++Builder
    Réponses: 3
    Dernier message: 24/06/2003, 15h23

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