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}

War es hilfreich?

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:

  1. Aktualisieren Sie das Originalwörterbuch, indem Sie darauf verweisen SomeClass.dictionary.
  2. 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.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top