Aktualisieren einer statischen Variablen beim Erweitern einer Python-Klasse
-
21-12-2019 - |
Frage
Ich schreibe eine Erweiterung für eine Bibliothek und möchte meine neue Funktion bei einem Wörterbuch von Funktionszeigern in der Basisklasse registrieren.Meines Wissens nach ist das Wörterbuch statisch und sollte aktualisierbar sein, da es sich im obersten Bereich einer Klasse befindet.Allerdings, wenn ich es versuche update()
Das Wörterbuch mit der neuen Funktion in der erweiterten Klasse sagt mir, dass sie undefiniert ist.Das folgende Minimalbeispiel reproduziert den Fehler:
def somefunction1(v):
return v
def somefunction2(v):
return v
class SomeClass(object):
dictionary = {'a':somefunction1}
class SomeExtensionClass(SomeClass):
dictionary.update({'b':somefunction2})
Beim Ausführen wird der folgende Fehler angezeigt
9
10 class SomeExtensionClass(SomeClass):
---> 11 dictionary.update({'b':somefunction2})
NameError: name 'dictionary' is not defined
Da ich das Original nicht (vernünftigerweise) modifizieren kann SomeClass
Gibt es eine Möglichkeit, das zu umgehen?
Bearbeiten:Das gewünschte Ergebnis ist das SomeExtensionClass
werde haben dictionary={'a':somefunction1, 'b':somefunction2}
Lösung
Wenn Sie etwas ändern möchten SomeClass.dictionary
, bezeichnen Sie es einfach als SomeClass.dictionary
:
SomeClass.dictionary.update(whatever)
Variablensuche innerhalb eines class
Die Anweisung durchsucht nicht die Attribute der Superklassen.
Wenn Sie ein neues Wörterbuch möchten, dann SomeExtensionClass.dictionary
unterscheidet sich von SomeClass.dictionary
, möchten Sie das Original kopieren und die Kopie aktualisieren:
class SomeExtensionClass(SomeClass):
dictionary = SomeClass.dictionary.copy()
dictionary.update(whatever)
Andere Tipps
Es gibt zwei sinnvolle Möglichkeiten, SomeExtensionClass ein aktualisiertes Wörterbuch zu geben:
- Aktualisieren Sie das Originalwörterbuch, indem Sie darauf verweisen
SomeClass.dictionary
. - Definieren Sie eine Sekunde
dictionary
Variable für die abgeleitete Klasse.
Den zweiten können Sie so machen:
class SomeExtensionClass(SomeClass):
dictionary = dict(SomeClass.dictionary, b=somefunction2)
Welche Sie wählen sollten, hängt davon ab, wer das Wörterbuch wofür verwendet.Wenn eine SomeClass-Methode die Variable wie folgt verwendet:
def foo(self):
a = self.dictionary['a']()
Die Methode verwendet das SomeExtensionClass-Wörterbuch für SomeExtensionClass-Objekte.Wenn OTOH es tut:
def foo(self):
a = SomeClass.dictionary['a']()
Es wird immer das in SomeClass definierte Wörterbuch verwendet.