Ответ 1
Вы сохраняете несвязанные объекты staticmethod
в словаре. Такие объекты (а также объекты classmethod
, функции и объекты property
) связаны только через протокол дескриптора, обращаясь к имени как атрибут класса или экземпляра. Непосредственный доступ к объектам staticmethod
в кубе класса не является доступом к атрибуту.
Либо создайте словарь после создания класса (чтобы вы получили доступ к ним как атрибуты), либо напрямую привязали, либо извлекли исходную функцию, прежде чем хранить их в словаре.
Обратите внимание, что привязка для объектов staticmethod
просто означает, что контекст просто игнорируется; связанная staticmethod
возвращает базовую функцию без изменений.
Таким образом, ваши варианты - это отменить словарь и запустить протокол дескриптора с помощью атрибутов:
class A(object):
@staticmethod
def open():
return 123
@staticmethod
def proccess():
return 456
A.switch = {
1: A.open,
2: A.proccess,
}
или явно связывать, передавая в фиктивном контексте (который все равно будет проигнорирован):
class A(object):
@staticmethod
def open():
return 123
@staticmethod
def proccess():
return 456
switch = {
1: open.__get__(object),
2: proccess.__get__(object),
}
или получить доступ к базовой функции напрямую с помощью атрибута __func__
:
class A(object):
@staticmethod
def open():
return 123
@staticmethod
def proccess():
return 456
switch = {
1: open.__func__,
2: proccess.__func__,
}
Однако, если все, что вы пытаетесь сделать, это предоставить пространство имен для кучи функций, тогда вы не должны использовать объект класса в первую очередь. Поместите функции в модуль. Таким образом, вам не нужно использовать декораторы staticmethod
в первую очередь и не нужно их снова разворачивать.