Esto lo hará:
>>> 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
Usted dice "¿Eh? Simplemente cambia el nombre de @abstractmethod", y esto es completamente correcto. Porque cualquier subclase de las anteriores tendrá que incluir el decorador @staticmethod de todos modos. No lo necesita aquí, excepto como documentación al leer el código. Una subclase debería verse así:
>>> class B(A):
... @staticmethod
... def themethod():
... print "Do whatevs"
Para tener una función que le obligue a convertir este método en un método estático, tendrá que subclasificar ABCmeta para verificarlo y aplicarlo. Eso es mucho trabajo sin retorno real. (Si alguien olvida el decorador de @staticmethod, obtendrá un claro error de todos modos, simplemente no mencionará los métodos estáticos.
Entonces, de hecho, esto funciona igual de bien:
>>> import abc
>>>
>>> class A(object):
... __metaclass__ = abc.ABCMeta
... @abc.abstractmethod
... def themethod():
... """Subclasses must implement this as a @staticmethod"""
... pass
Actualización - Otra forma de explicarlo:
Que un método sea estático controla cómo se llama. Nunca se llama a un método abstracto. Y el método estático abstracto es, por lo tanto, un concepto bastante inútil, excepto para fines de documentación.