'staticmethod' - Objekt ist nicht aufrufbar "switch/case"
Habe ich diesen code:
class A(object):
@staticmethod
def open():
return 123
@staticmethod
def proccess():
return 456
switch = {
1: open,
2: proccess,
}
obj = A.switch[1]()
Wenn ich diesen starte bekomme ich immer die Fehlermeldung:
TypeError: 'staticmethod' object is not callable
wie es zu lösen?
- stackoverflow.com/questions/3798835/...
- Mögliche Duplikate von 'classmethod' - Objekt ist nicht aufrufbar
- Hoppla, ich bin nicht sicher, warum ich verpaßt.
- nicht ganz ein dupe, haben Sie unterschiedliche (mehrere) Optionen mit
staticmethod
Objekte. - Oh, war mir nicht ganz klar, dass der Frage-Titel stimmt nicht mit der Fehlermeldung in den Körper.
- in der Tat, ich habe es falsch zunächst zu, dann aber vergessen zu Bearbeiten die Frage-Titel.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Den Sie speichern ungebundene
staticmethod
Objekte in einem dictionary. Solche Objekte (sowieclassmethod
- Objekte, - Funktionen und -property
- Objekte) werden nur gebunden durch die Deskriptor-Protokoll, indem man den Namen wie ein Attribut der Klasse oder einer Instanz. Direkter Zugriff auf diestaticmethod
Objekte in die Klasse der Körper ist nicht ein Attribut zugreifen.Entweder erstellen Sie das Wörterbuch nach Erstellung der Klasse (so Sie auf Sie als Attribute), oder explizit binden, oder extrahieren Sie die original-Funktion vor dem speichern in der dictionary.
Beachten Sie, dass "verbindlich" für
staticmethod
Objekte bedeutet lediglich, dass der Kontext nur ignoriert; eine gebundenestaticmethod
gibt die zugrunde liegende Funktion unverändert.So sind Ihre Optionen, um unindent-das Wörterbuch und der trigger descriptor-Protokoll durch die Verwendung von Attributen:
oder explizit binden, übergehend in eine dummy-Kontext (die werden ja eh ignoriert):
oder den Zugriff auf die zugrunde liegende Funktion direkt mit der
__func__
Attribut:Allerdings, wenn alles, was Sie versuchen zu tun ist, bieten eine namespace für eine Reihe von Funktionen, dann sollten Sie nicht verwenden Sie eine Klasse-Objekt in den ersten Platz. Die Funktionen in ein Modul. So dass Sie nicht haben, um zu verwenden
staticmethod
Dekorateure in Erster Linie und nicht packen Sie wieder.