Sie speichern ungebundene staticmethod Objekte in einem Wörterbuch. Solche Objekte (sowie classmethodObjekte, Funktionen und propertyObjekte) werden nur durch das Deskriptorprotokoll gebunden , indem auf den Namen als Attribut für die Klasse oder eine Instanz zugegriffen wird. Der direkte Zugriff auf die staticmethodObjekte im Klassenkörper ist kein Attributzugriff.
Erstellen Sie das Wörterbuch entweder nach dem Erstellen der Klasse (damit Sie als Attribute darauf zugreifen können) oder binden Sie es explizit oder extrahieren Sie die ursprüngliche Funktion, bevor Sie sie im Wörterbuch speichern.
Beachten Sie, dass "Bindung" für staticmethodObjekte lediglich bedeutet, dass der Kontext lediglich ignoriert wird. Eine Grenze staticmethodgibt die zugrunde liegende Funktion unverändert zurück.
Sie können also das Wörterbuch aufheben und das Deskriptorprotokoll mithilfe von Attributen auslösen:
class A(object):
@staticmethod
def open():
return 123
@staticmethod
def proccess():
return 456
A.switch = {
1: A.open,
2: A.proccess,
}
oder explizit zu binden, indem ein Dummy-Kontext übergeben wird (der sowieso ignoriert wird):
class A(object):
@staticmethod
def open():
return 123
@staticmethod
def proccess():
return 456
switch = {
1: open.__get__(object),
2: proccess.__get__(object),
}
oder greifen Sie direkt mit dem __func__Attribut auf die zugrunde liegende Funktion zu :
class A(object):
@staticmethod
def open():
return 123
@staticmethod
def proccess():
return 456
switch = {
1: open.__func__,
2: proccess.__func__,
}
Wenn Sie jedoch nur versuchen, einen Namespace für eine Reihe von Funktionen bereitzustellen , sollten Sie zunächst kein Klassenobjekt verwenden. Stellen Sie die Funktionen in ein Modul . Auf diese Weise müssen Sie überhaupt keine staticmethodDekorateure verwenden und diese nicht erneut auspacken.