Подтвердить что ты не робот

Объект "staticmethod" не вызывается

У меня есть этот код:

class A(object):
    @staticmethod
    def open():
        return 123
    @staticmethod
    def proccess():
        return 456

    switch = {
        1: open,
        2: proccess,   
        }

obj = A.switch[1]()

При запуске я получаю сообщение об ошибке:

TypeError: 'staticmethod' object is not callable

как это решить?

4b9b3361

Ответ 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 в первую очередь и не нужно их снова разворачивать.