Почему я получаю сообщение «объект staticmethod не вызывается», когда пытаюсь получить метод?

Я пытаюсь дать пользователю возможность выбирать, какую функцию использовать для класса.

Фрагмент 1

Что-то вроде этого:

class TestFoo():

    @staticmethod
    def foo(x, y):
        return x * y

    methodstr2method = {'foo': foo}

    def __init__(self, method_str):
        self.method = self.methodstr2method[method_str]

    def exec(self, x, y):
        return self.method(x, y)


a = TestFoo('foo')
print(a.exec(3, 7))

Однако я получаю

Traceback (most recent call last):
  File "/home/math/Desktop/foobar.py", line 17, in <module>
    print(a.exec(3, 7))
  File "/home/math/Desktop/foobar.py", line 13, in exec
    return self.method(x, y)
TypeError: 'staticmethod' object is not callable

Когда я удаляю @staticmethod, он работает. Почему это так? Я думал, что без декоратора первым аргументом всегда будет self или cls? Почему фрагмент 1 не работает?

Фрагмент 2

Однако этот работает:

class TestFoo():

    @staticmethod
    def foo(x, y):
        return x * y


    def __init__(self, method_str):
        self.methodstr2method = {'foo': self.foo}
        self.method = self.methodstr2method[method_str]

    def exec(self, x, y):
        return self.method(x, y)


a = TestFoo('foo')
print(a.exec(3, 7))

person Martin Thoma    schedule 17.07.2019    source источник
comment
Может быть полезно: stackoverflow.com /вопросы/41921255/   -  person Mark    schedule 17.07.2019
comment
Добавьте foo.__func__ согласно другому ответу.   -  person matt    schedule 17.07.2019
comment
Для фрагмента 1 foo() не является статическим методом. Просто удалите декоратор @staticmethod из foo() и запустите снова. Вы получите 21 в качестве вывода.   -  person Kushan Gunasekera    schedule 17.07.2019