[Python] Erbt eine Klasse mit Klassenvariablen

Wenn mehrere Klassen von der übergeordneten Klasse mit Klassenvariablen erben Beachten Sie, dass das Verhalten beim Zugriff der untergeordneten Klasse auf die Klassenvariable verdächtig war.

Fazit (?):

--Mutable Klassenvariablen werden wahrscheinlich auch in der geerbten untergeordneten Klasse gemeinsam genutzt. --Schreiben Sie dieselbe Variable in der untergeordneten Klasse, wenn Sie sie separat verwalten möchten

Symptome

#Elternklasse
class AbstClass:
    class_number = 0
    dict_number = {'class': 0}

#Kinderklasse 1
class Class1(AbstClass):
    def __init__(self):
        self.class_number = 1
        self.dict_number['class'] = 1

#Kinderklasse 2
class Class2(AbstClass):
    def __init__(self):
        self.class_number = 2
        self.dict_number['class'] = 2

obj1 = Class1()
print(obj1.class_number, obj1.dict_number['class']) # 1,1 ← Verstehe
obj2 = Class2()
print(obj2.class_number, obj2.dict_number['class']) # 2,2 ← Verstehen
print(obj1.class_number, obj1.dict_number['class']) # 1, 2 ←!?

Es ist leicht zu verstehen, ob "zwei untergeordnete Klassen auf die Klassenvariablen derselben übergeordneten Klasse zugreifen". Im obigen Beispiel

--class_number wird von zwei Klassen getrennt verwaltet --dict_number wird von zwei Klassen gemeinsam genutzt → Überschreibt dict_numer, das in Class1 neu geschrieben wurde, wenn Class2 () ausgeführt wird

Es ist geworden.

Ursache Hypothese

Ist veränderlich / unveränderlich beteiligt? Ich vermute. Mit anderen Worten

--mutable Klassenvariable (dict_number oben): wird von untergeordneten Klassen geteilt

Wenn Sie in AbstClass ein Taple von "class_number_tuple = (0,)" definieren, Das gleiche Verhalten wie "class_number" wurde bestätigt. (* Int ist unveränderlich. Referenz: [GAMMASOFT: In Python integrierte Klassentabelle für Datentypen (veränderbar usw.)] (https://gammasoft.jp/blog/python-built-in-types/))

Gegenmaßnahmen

Definieren Sie Klassenvariablen in untergeordneten Klassen neu:

class Class1(AbstClass):
    class_number = 0
    dict_kv = {'class': 0}

class Class2(AbstClass):
    class_number = 0
    dict_kv = {'class': 0}

In jedem Fall werden die Klassenvariablen jeder Klasse priorisiert = sie werden separat verwaltet.

Wenn Sie möchten, möchte ich jedoch, dass Sie automatisch eine Ausnahme als Sprache auslösen.

――In der Tat, wenn ich eine Liste in den Schlüssel des Wörterbuchs stecke, ärgere ich mich über Unhashable

Als aktuelle Maßnahme

Geht es um ... Ich würde mich freuen, wenn Sie mir gute Maßnahmen nennen könnten.

Recommended Posts

[Python] Erbt eine Klasse mit Klassenvariablen
Erstellen Sie mit Class einen Python-Funktionsdekorator
[Hinweis] Erstellen Sie mit Python eine einzeilige Zeitzonenklasse
Probleme mit pseudo-privaten Python-Variablen und Klassenvererbung
Python: Klassen- und Instanzvariablen
Python-Klassen- und Instanzvariablen
Machen Sie eine Lotterie mit Python
Erstellen Sie ein Verzeichnis mit Python
Löse ABC163 A ~ C mit Python
Bedienen Sie den Belegdrucker mit Python
Python-Grafikhandbuch mit Matplotlib.
In Python-Klassenvariablen versteckte Landminen
Lassen Sie uns eine GUI mit Python erstellen.
Löse ABC166 A ~ D mit Python
Klassenvariable
Erstellen Sie eine virtuelle Umgebung mit Python!
Ich habe mit Python eine Lotterie gemacht.
[Python] -Variablen
Erstellen einer virtuellen Umgebung mit Python 3
Löse ABC168 A ~ C mit Python
[Python] Generiere ein Passwort mit Slackbot
Löse ABC162 A ~ C mit Python
Löse ABC167 A ~ C mit Python
Löse ABC158 A ~ C mit Python
Lassen Sie uns ein Diagramm mit Python erstellen! !!
Ich habe mit Python einen Daemon erstellt
Schreiben Sie ein Batch-Skript mit Python3.5 ~
[Road to Intermediate Python] Rufen Sie eine Klasseninstanz wie eine Funktion mit __call__ auf
[Pyenv] Erstellen einer Python-Umgebung mit Ubuntu 16.04
Generieren Sie eine erstklassige Sammlung in Python
Spiralbuch in Python! Python mit einem Spiralbuch! (Kapitel 14 ~)
Erstellen einer einfachen Power-Datei mit Python
[Python] Ein Programm, das Treppen mit # erstellt
Lassen Sie uns mit Python ein Shiritori-Spiel machen
Installieren Sie Python als Framework mit pyenv
[Python] Wie man eine Klasse iterierbar macht
Ich habe mit Python einen Zeichenzähler erstellt
[Python] Zeichnen eines Wirbelmusters mit einer Schildkröte
Ich habe eine Heatmap mit Seaborn [Python] gezeichnet.
[Python] Erstellen Sie mit Anaconda eine virtuelle Umgebung
Erstellen wir mit Python eine kostenlose Gruppe
Ein Memo mit Python2.7 und Python3 in CentOS
Erstellen einer Python 3.6-Umgebung mit Windows + PowerShell
Kartenmietinformationen auf einer Karte mit Python
Durchsuche das Labyrinth mit dem Python A * -Algorithmus
Trump-Klasse in Python (mit Vergleich)
Lassen Sie uns mit Python langsam sprechen
Erstellt eine Reise von Darts mit Python (Nachrichten)
[Python] Eine schnelle Webanwendung mit Bottle!
[AtCoder] Löse ABC1 ~ 100 Ein Problem mit Python
Schreiben Sie einen TCP-Client mit Python Twisted
Was ich mit Python-Arrays gemacht habe
Löse AtCoder ABC168 mit Python (A ~ D)
Erstellen Sie mit Python 3.4 einen Worthäufigkeitszähler
Versuchen Sie HTML-Scraping mit der Python-Bibliothek
Ich habe mit Python eine Hex-Map erstellt