Problème avec les variables pseudo-privées Python et l'héritage de classe

Les classes Python n'ont pas le concept de restreindre l'accès aux variables membres. Toutes les variables sont traitées comme publiques.

Par conséquent, il est possible de créer une variable pseudo-privée, mais lorsque j'ai essayé de l'utiliser avec l'héritage de classe, je suis resté bloqué, j'ai donc pris une note en guise de dépannage.

error_case


class BaseClass(object):
    def __init__(self):
        self.__param = "I'm BaseClass"
        
class ChildClass(BaseClass):
    def hello(self):
        print self.__param

ChildClass().hello()

AttributeError Traceback (most recent call last) in () ----> 1 ChildClass().hello() in hello(self) 5 class ChildClass(BaseClass): 6 def hello(self): ----> 7 print self.__param AttributeError: 'ChildClass' object has no attribute '_ChildClass__param'


## Pseudo variable privée

 Vous pouvez créer une pseudo variable privée en préfixant le nom d'une variable membre avec deux traits de soulignement.

 Cependant, en interne, préparez une variable publique nommée `` `` _ {classname} __ {variable name} `` ``, et faites-y référence depuis la classe avec le nom `` __ {variable name} `` ``. J'essaye juste de le faire. C'est pourquoi c'est une variable privée "pseudo".


#### **`sample_program`**
```python

class Sample(object):
    def __init__(self):
        self.__param = "I'm Sample"

sample = Sample()
print sample.__param

AttributeError Traceback (most recent call last) in () 4 5 sample = Sample() ----> 6 print sample.__param AttributeError: 'Sample' object has no attribute '__param'



#### **`sample_program`**
```python

sample = Sample()
print sample._Sample__param

"I'm Sample"


## Combinaison avec héritage de classe

 Comme dans le cas d'erreur en haut, ** une tentative d'accès à une variable pseudo-privée définie par une méthode de la classe parent depuis l'intérieur de la classe enfant échoue **.

 Apparemment, la cause est due aux spécifications internes de la variable pseudo-privée.

 Les variables pseudo-membres déclarées dans la classe parente semblent être plongées en interne dans `` self._BaseClass__param '', même si elles sont héritées.

 D'un autre côté, lorsque vous essayez de voir `` `` self .__ param``` à partir d'une classe enfant, c'est naturellement `` _ChildClass__param``` qui fait référence, donc une erreur indiquant qu'il n'y a pas de telle variable est renvoyée.

## Solution

 Si vous utilisez l'héritage de classe, déclarez les getters ensemble dans la classe parent.


#### **`successful_case1`**
```python

class BaseClass(object):
    def __init__(self):
        self.__param = "I'm BaseClass"
        
    def get_param(self):
        return self.__param
        
class ChildClass(BaseClass):
    def hello(self):
        print self.get_param()

"I'm BaseClass"


 (Mise à jour) Faites-en une propriété de la classe parent. Il est possible d'empêcher le réglage direct de l'extérieur.


#### **`successful_case2`**
```python

class BaseClass(object):
   def __init__(self):
       self.__param = "I'm BaseClass"

   @property
   def _param(self):
       return self.__param

class ChildClass(BaseClass):
   def hello(self):
       print self._param

Il peut s'agir d'une situation qui se produit rarement, mais qui est inopinément gênante.

version

2.7.12 |Anaconda 4.2.0 (x86_64)| (default, Jul 2 2016, 17:43:17) \n[GCC 4.2.1 (Based on Apple Inc. build 5658) (LLVM build 2336.11.00)]

Recommended Posts

Problème avec les variables pseudo-privées Python et l'héritage de classe
Python: variables de classe et d'instance
Variables de classe et d'instance Python
[Python] Hériter d'une classe avec des variables de classe
[Python] Comment jouer avec les variables de classe avec décorateur et métaclasse
[Python] Héritage de classe (super)
[python] Différence entre variable et self. Variable dans la classe
[Python] Héritage de classe, remplacement
Programmation avec Python et Tkinter
Chiffrement et déchiffrement avec Python
Python et matériel - Utilisation de RS232C avec Python -
À propos des variables et des objets Python
Variables Python et ID d'objet
python avec pyenv et venv
Héritage de classe et super fonction
Fonctionne avec Python et R
J'ai des problèmes avec les variables d'instance héritées en Python
Communiquez avec FX-5204PS avec Python et PyUSB
Briller la vie avec Python et OpenCV
Installez Python 2.7.9 et Python 3.4.x avec pip.
objet perl et classe python partie 2.
Réseau neuronal avec OpenCV 3 et Python 3
Modulation et démodulation AM avec python
Scraping avec Node, Ruby et Python
[Hikari-Python] Chapitre 09-03 Classe (Héritage)
Les mines terrestres cachées dans les variables de classe Python
Grattage avec Python et belle soupe
Définitions de classe Python et gestion des instances
Encodage et décodage JSON avec python
Introduction à Hadoop et MapReduce avec Python
[GUI en Python] PyQt5-Glisser-déposer-
Lire et écrire NetCDF avec Python
J'ai joué avec PyQt5 et Python3
objet perl et classe python partie 1.
Lire et écrire du CSV avec Python
Intégration multiple avec Python et Sympy
Coexistence de Python2 et 3 avec CircleCI (1.0)
Jeu Sugoroku et jeu d'addition avec Python
Modulation et démodulation FM avec Python
J'étais accro aux variables de classe et aux variables d'instance erronées en Python
Communiquez entre Elixir et Python avec gRPC
Construction de pipeline de données avec Python et Luigi
Calculer et afficher le poids standard avec python
Créer un décorateur de fonction Python avec Class
Surveiller les pannes de Mojo avec Python et Skype
[Python] Utiliser et et ou lors de la création de variables
Modulation et démodulation FM avec Python Partie 3
[Automation] Manipulez la souris et le clavier avec Python
Exemple d'utilisation de variables de classe et de méthodes de classe
Authentification sans mot de passe avec RDS et IAM (Python)
Installation de Python et gestion des packages avec pip
Utilisation de Python et MeCab avec Azure Databricks
Variable de classe
POSTER diversement avec Python et recevoir avec Flask
Capturer des images avec Pupil, python et OpenCV
Fractal pour faire et jouer avec Python
Un mémo contenant Python2.7 et Python3 dans CentOS
[Python] Variables