Это сделает это:
>>> import abc
>>> abstractstaticmethod = abc.abstractmethod
>>>
>>> class A(object):
... __metaclass__ = abc.ABCMeta
... @abstractstaticmethod
... def themethod():
... pass
...
>>> a = A()
>>> Traceback (most recent call last):
File "asm.py", line 16, in <module>
a = A()
TypeError: Can't instantiate abstract class A with abstract methods test
Вы идете "Э? Это просто переименовывает @abstractmethod", и это совершенно правильно. Потому что любой подкласс из вышеперечисленного должен будет все равно включать декоратор @staticmethod. Вам это здесь не нужно, за исключением документации при чтении кода. Подкласс должен выглядеть следующим образом:
>>> class B(A):
... @staticmethod
... def themethod():
... print "Do whatevs"
Чтобы иметь функцию, которая заставит вас сделать этот метод статическим, вам придется создать подкласс ABCmeta, чтобы проверить это и применить его. Это большая работа без реального возвращения. (Если кто-то забудет декоратор @staticmethod, он все равно получит явную ошибку, он просто не будет упоминать статические методы.
Так что на самом деле это работает так же хорошо:
>>> import abc
>>>
>>> class A(object):
... __metaclass__ = abc.ABCMeta
... @abc.abstractmethod
... def themethod():
... """Subclasses must implement this as a @staticmethod"""
... pass
Обновление - еще один способ объяснить это:
То, что метод является статическим, контролирует, как он вызывается.
Абстрактный метод никогда не вызывается.
И поэтому абстрактный статический метод является довольно бессмысленным понятием, кроме как для целей документирования.