En mi aplicación Python, quiero crear un método que sea a la vez ay staticmethod
an abc.abstractmethod
. ¿Cómo hago esto?
Intenté aplicar ambos decoradores, pero no funciona. Si hago esto:
import abc
class C(object):
__metaclass__ = abc.ABCMeta
@abc.abstractmethod
@staticmethod
def my_function(): pass
Recibo una excepción *, y si hago esto:
class C(object):
__metaclass__ = abc.ABCMeta
@staticmethod
@abc.abstractmethod
def my_function(): pass
El método abstracto no se aplica.
¿Cómo puedo hacer un método estático abstracto?
*La excepción:
File "c:\Python26\Lib\abc.py", line 29, in abstractmethod
funcobj.__isabstractmethod__ = True
AttributeError: 'staticmethod' object has no attribute '__isabstractmethod__'
python
abstract-class
static-methods
Ram Rachum
fuente
fuente
Respuestas:
fuente
import abc
arriba; así como una subclase que muestra la instanciación de A. (p. ej.,class B(A):\n @staticmethod\n def test():\n print 10\n
)__isabstractmethod__
atributo.abstractstatic
agregarse aguas arribaabc.py
?A partir de Python 3.3 , es posible combinar
@staticmethod
y@abstractmethod
, por lo que ya no es necesaria ninguna de las otras sugerencias:fuente
@staticmethod
como primero, o obtendráAttributeError: attribute '__isabstractmethod__' of 'staticmethod' objects is not writable
@property
Esto lo hará:
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í:
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:
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.
fuente
Actualmente, esto no es posible en Python 2.X, que solo hará que el método sea abstracto o estático, pero no ambos.
En Python 3.2+, los nuevos decoradores
abc.abstractclassmethod
yabc.abstractstaticmethod
se agregaron para combinar su aplicación de ser abstracto y estático o abstracto y un método de clase.Ver Python Issue 5867
fuente
abstractclassmethod
yabstractstaticmethod
se desaprobó rápidamente en Python 3.3, así comoabstractproperty
. docs.python.org/3/library/abc.html