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 - Accès au attributs


Sujet :

Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    54
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Mai 2008
    Messages : 54
    Par défaut Encapsulation - Accès au attributs
    Bonjour,

    J'ai créér une classe Projet.py. Dans mon fichier main, j'ai remarqué que je peux acceder à la variable _nomProjet. Je voulais savoir quelle est la meilleur technique qu'on peut encapsuler nos variable; et comment ne pas faciliter l'acces à une instance d'une classe d'acceder à une variable du constructeur ?

    Merci.



    Projet.py

    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
     
     
    from bokeh.util.session_id import random
     
    class Projet:
        def __init__(self,nom,details):
            self._codeProjet     = 'PRO'+ str(random.randint(100,10000))
            self._nomProjet      = nom
            self._detailsProjet  = details
     
        @property
        def codeProjet(self):
            return self._codeProjet
     
     
        @property
        def nomProjet(self):
            return self._nomProjet
        @nomProjet.setter
        def nomProjet(self,val):
            self._nomProjet = val
     
     
        def AfficherInfoProjet(self):
            print('Le projet saisi est : ' + self.codeProjet)


    main.py
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    from classes.Projet import Projet
     
    if __name__ == "__main__":
        p1 = Projet('JeuPalmas', 'Il est inventé par Jean le 12 oct 2017')
     
        print(p1._nomProjet, p1.nomProjet)

  2. #2
    Membre très actif

    Homme Profil pro
    Bidouilleur
    Inscrit en
    Avril 2016
    Messages
    721
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Bidouilleur

    Informations forums :
    Inscription : Avril 2016
    Messages : 721
    Billets dans le blog
    1
    Par défaut
    Salut.

    En préfixant les attributs d'un double underscore, cela permet de les rendre privés (enfin plus ou moins).

    Un exemple pour comprendre.

    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
    class A :
        def __init__(self) :
            self.__private = 10
            self._protected = 20
            self.public = 30
     
        private = property(lambda self: self.__private)
     
     
    a = A()
    print(a.public)
    print(a._protected)
    try :
        print(a.__private)
    except AttributeError :
        print('pas possible !')
     
    # Mais on peut toujours
    print(a.private)
    a.__dict__['_A__private'] = 'zut'
    print(a.private)
    Il n'y a pas nativement de méthode pour rendre des attributs, méthodes de classes réellement privées, il y a seulement des conventions.

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    54
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Mai 2008
    Messages : 54
    Par défaut
    Merci pour ton explication, je comprends bien.

    1- Mais, créer des méthodes getter et setter ainsi puis de les utiliser est-ce correct ? Est-ce que ce ne sont pas des propriétés ?:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    @property
        def nomProjet(self):
            return self._nomProjet
        @nomProjet.setter
        def nomProjet(self,val):
            self._nomProjet = val
    2- Suivant ton code, à quel moment on peut créer les propriétés?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    private = property(lambda self: self.__private)

  4. #4
    Membre très actif

    Homme Profil pro
    Bidouilleur
    Inscrit en
    Avril 2016
    Messages
    721
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Bidouilleur

    Informations forums :
    Inscription : Avril 2016
    Messages : 721
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par calito Voir le message
    Mais, creer des methodes getter et setter ainsi puis de les utiliser est-ce correcte ? Est-ce que ce ne sont pas des propriétés ?
    Oui, c'est correct, et c'est même fortement conseillé, les setters peuvent être nécessaires afin de vérifier si le type de valeur fournit est valide, puis en définissant des méthodes d'accessions, on peut y ajouter des docstrings, et si par je ne sais quel besoin on désire modifier la structure interne des données d'une classe, on aura pas à revoir tout le code faisant appels aux attributs, et tous les autres avantages.

    Citation Envoyé par calito Voir le message
    Suivant ton code, à quel moment on peut creer les propriétés?
    Avec la classe property, cela peut être parfois plus concis et suffisant pour définir les accesseurs, et indispensable si l'on souhaite par exemple définir une propriété en écriture seule (impossible avec les décorateurs), voir help(property) dans ton interpréteur python.

Discussions similaires

  1. Erreur lors de l'acces aux attributs
    Par userB dans le forum C++Builder
    Réponses: 1
    Dernier message: 14/09/2006, 12h37
  2. [POO] Acces aux attributs d'un objet depuis une methode evenement :s
    Par NikoGJ dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 13/07/2006, 19h01
  3. Acces aux attributs d'un bean dans une jsp
    Par mariemor64 dans le forum Struts 1
    Réponses: 2
    Dernier message: 02/06/2006, 10h32
  4. Accès aux attributs d'une balise HTML
    Par tatou42 dans le forum Général JavaScript
    Réponses: 6
    Dernier message: 09/02/2006, 14h01
  5. [DOM] Accès aux attributs d'un noeud
    Par vasilov dans le forum Format d'échange (XML, JSON...)
    Réponses: 8
    Dernier message: 13/07/2005, 14h19

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