Partage
  • Partager sur Facebook
  • Partager sur Twitter

Question sur l'encapsulation

    26 mai 2019 à 23:36:30

    Hello, 

    Je viens de me lancer dans l'apprentissage du langage Python, je galère un peu sur la partie encapsulation. Si je souhaite protéger l'accès à une variable, je dois passer par des getters est-ce bien ça ?

    Je teste en ce moment ce programme :

    class Humain:
    
    	def __init__(self,nom,age) : 
    		self._nom = nom
    		self._age = age
    	def getAge(self) :
    		return self._age
    	age = property(getAge)
    
    
    h1 = Humain("Zak",22)
    print(h1._age)
    

    Je ne comprends pas pourquoi j'ai encore accès à la variable "_age" depuis l'extérieur. Comment mettre l'attribut "_age" en "private" ? Quel intérêt d'utilisé "property" si on peut accéder à la variable depuis l'exterieur de la classe ?

    • Partager sur Facebook
    • Partager sur Twitter
      27 mai 2019 à 8:41:18

      Bonjour,

      Si vous arrivez à accéder à _age, c'est simplement parce qu'en python ce n'est qu'une convention de ne pas accéder au variables dont le nom commence par "_". C'est à dire que même si c'est possible, on ne le fait pas.

      C'est un peu comme la façon de nommer une variable on une classe, rien n'oblige que le nom de la classe commence par un majuscule mais on le fait quand même.

      Si une autre personne utilise votre classe et qu'elle voit la variable _age, elle ne devrait pas l'utiliser directement mais passer par la propriété "age" car la convention le veut.

      print(h1.age)

      J'espère avoir bien expliqué et vous avoir aidé.

      • Partager sur Facebook
      • Partager sur Twitter
        27 mai 2019 à 8:58:55

        Je comprends mieux, merci :)
        • Partager sur Facebook
        • Partager sur Twitter
          28 mai 2019 à 14:06:10

          Pour compléter le message ci-dessus et apporter une réponse aux questions soulevées :

          zaki95 a écrit: > Comment mettre l'attribut "_age" en "private" ?

          Ce concept n'existe pas en Python. Rien n'est invisible/inaccessible depuis l'extérieur : un des postulats de Python est que l'on est « entre adultes consentants », donc pas besoin d'interdire un accès si la personne sait ce qu'elle fait.

          Par contre il existe des conventions, comme celle du préfixe _. Il n'est pas synonyme de privé ou de protégé, il signale juste qu'un attribut correspond à l'état interne d'un objet et qu'il ne devrait pas être nécessaire d'y accéder, voire qu'il est dangereux de le modifier.

          zaki95 a écrit: > Quel intérêt d'utilisé "property" si on peut accéder à la variable depuis l'exterieur de la classe ?

          Déjà je comprends que le code que tu donnes ne soit qu'un exemple, et tu viens peut-être d'un langage comme Java ou C++, mais en effet, les propriétés ne servent pas à ça.

          Une propriété, ça sert à altérer ou masquer la modification d'un attribut, afin de ne pas compromettre l'état interne d'un objet (ses invariants). Par exemple si tu as un attribut qui n'est pas modifiable (dans ton cas cela pourrait être un identifiant associé à chaque Humain), ou un attribut qui dépend d'un autre et doit donc être modifié quand ce dernier l'est (un nom complet dépendant du prénom et du nom).

          Ça sert aussi à avoir des attributs calculés dynamiquement lors de leur accès (l'exemple du nom complet reste valable si tu choisis de ne pas le stocker dans l'objet).

          Ici, la modification de l'âge n'altère en rien l'intégrité de ton objet, rien n'en dépend, donc il n'est pas utile de le protéger derrière une propriété.

          • Partager sur Facebook
          • Partager sur Twitter

          Question sur l'encapsulation

          × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
          × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
          • Editeur
          • Markdown