Я пытаюсь дать пользователю возможность выбирать, какую функцию использовать для класса.
Фрагмент 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))
foo.__func__
согласно другому ответу. - person matt   schedule 17.07.2019foo()
не является статическим методом. Просто удалите декоратор@staticmethod
изfoo()
и запустите снова. Вы получите 21 в качестве вывода. - person Kushan Gunasekera   schedule 17.07.2019