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 :

Encapsulation & héritage python


Sujet :

Python

  1. #1
    Nouveau candidat au Club
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Août 2021
    Messages
    1
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Cher (Centre)

    Informations professionnelles :
    Activité : Administrateur de base de données

    Informations forums :
    Inscription : Août 2021
    Messages : 1
    Par défaut Encapsulation & héritage python
    Bonjour à tous,

    Je débute dans la programmation python et je bloque sur le problème suivant :

    J'ai une classe qui permet à l'utilisateur de créer des grandeurs physique.
    Dans cette classe j'ai un attribut : nom

    J'ai une classe Longueur qui hérite de la classe Grandeur.

    Je souhaite empêcher l'utilisateur de modifier le nom de la classe longueur.

    Comment je peux faire ?

    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
     
    class Grandeur:
        """Création des grandeurs de bases du système international
        prend en paramètres :
            -Le nom de la grandeur
            -Le symbole de la grandeur
        """
        def __init__(self, nomGrandeur, symboleGrandeur):
            if len(nomGrandeur) == 0 :
                print("Le nom de la grandeur ne peut être vide !")
            else :
                nomGrandeur = str(nomGrandeur)  
                self.nomGrandeur = nomGrandeur
                print("La grandeur {} a bien été créée" .format(nomGrandeur))
            if len(symboleGrandeur) == 0 :
                print("Le symbole de la grandeur ne peut être vide !")
            else :
                symboleGrandeur = str(symboleGrandeur)
                self.symboleGrandeur = symboleGrandeur              
     
    class Longueur(Grandeur):
        """Création des longueurs suivant le SI (unité de base m)
            prend en paramètre :
                - l'unité
        """
        def __init__(self, nomGrandeur = "Longueur", symboleGrandeur = "l"):
            super().__init__(nomGrandeur, symboleGrandeur)
     
        def _getnomgrandeur(self):
            return self._nomGrandeur
     
        def _setnomgrandeur(self, attribut, valeur):
            if attribut in self.__dict__:
                Grandeur.__setattr__(self, attribut, valeur)
            else :
                raise Exception("Modification impossible !")
     
        nomGrandeur = property( _getnomgrandeur, _setnomgrandeur)

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

    Citation Envoyé par Pimousse18 Voir le message
    Je souhaite empêcher l'utilisateur de modifier le nom de la classe longueur.
    Heu?! Python suppose que les utilisateurs ne sont pas des sauvages et utilisent les interfaces qu'on leur propose.
    Pour interdire quelque chose, il est préférable d'utiliser des langages construits pour... car avec Python on trouvera toujours un trou pour modifier ce qu'on veut.

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

  3. #3
    Membre Expert
    Homme Profil pro
    Inscrit en
    Avril 2004
    Messages
    1 068
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 1 068
    Par défaut
    Pourquoi laisser la possibilité de passer un nom différent en argument ?

  4. #4
    Expert éminent
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 743
    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 743
    Par défaut
    Citation Envoyé par josmiley Voir le message
    Pourquoi laisser la possibilité de passer un nom différent en argument ?
    Ce n'est pas le nom de la classe mais l'attribut d'une instance de la classe (qui par ailleurs n'a pas d'attribut "nom"). Par contre une classe a un attribut __name__.

    Ceci dit, une instance de la classe Longueur n'a pas besoin d'avoir un attribut où figure "Longueur" pour être une instance de Longueur.

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

  5. #5
    Membre Expert
    Homme Profil pro
    Inscrit en
    Avril 2004
    Messages
    1 068
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 1 068
    Par défaut
    Alors moi j'ai compris qu'il fallait empêcher la modification de l'attribut nomGrandeur d'une instance de Longueur.
    En élevant le paramètre 'nomGrandeur' de l'instanciation et en en faisant un property ça devrait marcher non ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    class Longueur(Grandeur):
        """Création des longueurs suivant le SI (unité de base m)
            prend en paramètre :
                - l'unité
        """
        def __init__(self):
            super().__init__("...","...")
     
        nomGrandeur = property(lambda self:"Longueur",lambda self,value:...) 
        symboleGrandeur = property(lambda self:"l",lambda self,value:...)

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

    Citation Envoyé par josmiley Voir le message
    En élevant le paramètre 'nomGrandeur' de l'instanciation et en en faisant un property ça devrait marcher non ?
    Ca "marche" au sens d'un Python "coopératif"... mais on pourra toujours passer à travers si on veut.

    Mais l'exemple est mal choisi: une instance de Longueur est une "Longueur": pas besoin d'avoir un attribut pour "forcer" çà...

    note: si on veut avoir un attribut accessible en lecture seule, il suffit de ne définir que le getter:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    >>> class A:
    ...    @property
    ...    def nom(self):
    ...        return type(self).__name__
    ...
    >>> A().nom
    'A'
    >>> A().nom = 'zzz'
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
    AttributeError: can't set attribute
    >>>
    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

Discussions similaires

  1. polymorphysme , encapsulation, héritage, énumération
    Par khalous91 dans le forum Débuter avec Java
    Réponses: 4
    Dernier message: 02/08/2015, 11h42
  2. problème d'héritage python 2.6
    Par KR_Prog dans le forum Général Python
    Réponses: 11
    Dernier message: 13/12/2012, 16h31
  3. [Python 2.7] Héritage et 'Has no attribute"
    Par Deimz dans le forum Général Python
    Réponses: 2
    Dernier message: 03/12/2012, 21h36
  4. Réponses: 0
    Dernier message: 01/07/2009, 09h33

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