Probleme mit pseudo-privaten Python-Variablen und Klassenvererbung

Python-Klassen haben nicht das Konzept, den Zugriff auf Mitgliedsvariablen einzuschränken. Alle Variablen werden als öffentlich behandelt.

Daher ist es möglich, eine pseudo-private Variable zu erstellen, aber als ich versuchte, sie zusammen mit der Klassenvererbung zu verwenden, blieb ich stecken und machte mir eine Notiz zur Fehlerbehebung.

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 private Variable

 Indem Sie dem Namen einer Mitgliedsvariablen zwei Unterstriche voranstellen, können Sie eine pseudo-private Variable erstellen.

 Bereiten Sie jedoch intern eine öffentliche Variable mit dem Namen `` _ _ {Klassenname} __ {Variablenname} `` `vor und verweisen Sie innerhalb der Klasse mit dem Namen` `` __ {Variablenname} `` darauf Ich versuche es nur. Deshalb ist es eine "pseudo" private Variable.


#### **`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"


## Kombination mit Klassenvererbung

 Wie im Fehlerfall oben schlägt ** der Versuch fehl, aus der untergeordneten Klasse heraus auf eine pseudo-private Variable zuzugreifen, die von einer Methode in der übergeordneten Klasse festgelegt wurde **.

 Anscheinend liegt die Ursache in den internen Spezifikationen der pseudo-privaten Variablen.

 Pseudomitgliedvariablen, die in der übergeordneten Klasse deklariert sind, scheinen intern in `` `self._BaseClass__param``` eingetaucht zu sein, selbst wenn sie vererbt werden.

 Wenn Sie dagegen versuchen, "self .__ param" aus einer untergeordneten Klasse zu sehen, wird natürlich auf "_ChildClass__param" "verwiesen, sodass ein Fehler zurückgegeben wird, der besagt, dass keine solche Variable vorhanden ist.

## Lösung

 Wenn Sie die Klassenvererbung verwenden, deklarieren Sie Getter zusammen in der übergeordneten Klasse.


#### **`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"


 (Update) Machen Sie es zu einer Eigenschaft der übergeordneten Klasse. Es ist möglich, eine direkte Einstellung von außen zu verhindern.


#### **`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

Es mag eine Situation sein, die selten vorkommt, aber unerwartet unpraktisch ist.

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

Probleme mit pseudo-privaten Python-Variablen und Klassenvererbung
Python: Klassen- und Instanzvariablen
Python-Klassen- und Instanzvariablen
[Python] Erbt eine Klasse mit Klassenvariablen
[Python] Wie man mit Klassenvariablen mit Dekorator und Metaklasse spielt
[Python] Klassenvererbung (super)
Unterschied zwischen Variablen und Selbst. Variablen in der [Python] -Klasse
[Python] Klassenvererbung, überschreiben
Programmieren mit Python und Tkinter
Ver- und Entschlüsselung mit Python
Python und Hardware-Verwenden von RS232C mit Python-
Informationen zu Python-Variablen und -Objekten
Python-Variablen und Objekt-IDs
Python mit Pyenv und Venv
Klassenvererbung und Superfunktion
Funktioniert mit Python und R.
Ich habe Probleme mit der Vererbung von Instanzvariablen in Python
Kommunizieren Sie mit FX-5204PS mit Python und PyUSB
Leuchtendes Leben mit Python und OpenCV
Installieren Sie Python 2.7.9 und Python 3.4.x mit pip.
Perl-Objekt und Python-Klasse Teil 2.
Neuronales Netzwerk mit OpenCV 3 und Python 3
AM-Modulation und Demodulation mit Python
Scraping mit Node, Ruby und Python
[Hikari-Python] Kapitel 09-03 Klasse (Vererbung)
In Python-Klassenvariablen versteckte Landminen
Kratzen mit Python und schöner Suppe
Python-Klassendefinitionen und Instanzbehandlung
JSON-Codierung und -Decodierung mit Python
Hadoop-Einführung und MapReduce mit Python
[GUI in Python] PyQt5-Drag & Drop-
Lesen und Schreiben von NetCDF mit Python
Ich habe mit PyQt5 und Python3 gespielt
Perl-Objekt und Python-Klasse Teil 1.
Lesen und Schreiben von CSV mit Python
Mehrfachintegration mit Python und Sympy
Koexistenz von Python2 und 3 mit CircleCI (1.0)
Sugoroku-Spiel und Zusatzspiel mit Python
FM-Modulation und Demodulation mit Python
Ich war süchtig nach falschen Klassenvariablen und Instanzvariablen in Python
Kommunizieren Sie mit gRPC zwischen Elixir und Python
Datenpipeline-Aufbau mit Python und Luigi
Berechnen Sie das Standardgewicht und zeigen Sie es mit Python an
Erstellen Sie mit Class einen Python-Funktionsdekorator
Überwachen Sie Mojo-Ausfälle mit Python und Skype
[Python] Verwenden Sie und und oder beim Erstellen von Variablen
FM-Modulation und Demodulation mit Python Part 3
[Automatisierung] Bearbeiten Sie Maus und Tastatur mit Python
Beispiel für die Verwendung von Klassenvariablen und Klassenmethoden
Passwortlose Authentifizierung mit RDS und IAM (Python)
Python-Installation und Paketverwaltung mit pip
Verwenden von Python und MeCab mit Azure Databricks
Klassenvariable
POST verschieden mit Python und empfange mit Flask
Bilder mit Pupil, Python und OpenCV aufnehmen
Fraktal zum Erstellen und Spielen mit Python
Ein Memo mit Python2.7 und Python3 in CentOS
[Python] -Variablen