Em meu aplicativo Python, quero fazer um método que seja ae staticmethod
an abc.abstractmethod
. Como eu faço isso?
Tentei aplicar os dois decoradores, mas não funcionou. Se eu fizer isso:
import abc
class C(object):
__metaclass__ = abc.ABCMeta
@abc.abstractmethod
@staticmethod
def my_function(): pass
Recebo uma exceção * e se eu fizer isso:
class C(object):
__metaclass__ = abc.ABCMeta
@staticmethod
@abc.abstractmethod
def my_function(): pass
O método abstrato não é obrigatório.
Como posso fazer um método estático abstrato?
*A exceção:
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
fonte
fonte
Respostas:
fonte
import abc
no topo; bem como uma subclasse que mostra a instanciação de A. (por exemplo,class B(A):\n @staticmethod\n def test():\n print 10\n
)__isabstractmethod__
atributo.abstractstatic
ser adicionado a montanteabc.py
?A partir do Python 3.3 , é possível combinar
@staticmethod
e@abstractmethod
, portanto, nenhuma das outras sugestões é mais necessária:fonte
@staticmethod
como primeiro, ou você obteráAttributeError: attribute '__isabstractmethod__' of 'staticmethod' objects is not writable
@property
Isso vai resolver:
Você diz "Eh? Ele apenas renomeia @abstractmethod", e isso está completamente correto. Porque qualquer subclasse acima terá que incluir o decorador @staticmethod de qualquer maneira. Você não precisa disso aqui, exceto como documentação ao ler o código. Uma subclasse teria que ser assim:
Para ter uma função que o obrigaria a tornar esse método um método estático, você teria que criar a subclasse ABCmeta para verificar isso e aplicá-lo. É muito trabalho sem retorno real. (Se alguém esquecer o decorador @staticmethod, obterá um erro claro de qualquer maneira, apenas não mencionará os métodos estáticos.
Então, na verdade, isso funciona tão bem:
Atualização - Outra maneira de explicar:
O fato de um método ser estático controla como ele é chamado. Um método abstrato nunca é chamado. E o método estático abstrato é, portanto, um conceito bastante inútil, exceto para fins de documentação.
fonte
Atualmente, isso não é possível no Python 2.X, que só forçará o método a ser abstrato ou estático, mas não ambos.
No Python 3.2+, os novos decoradores
abc.abstractclassmethod
eabc.abstractstaticmethod
foram adicionados para combinar sua aplicação de ser abstrato e estático ou abstrato e um método de classe.Consulte Python Edição 5867
fonte
abstractclassmethod
eabstractstaticmethod
rapidamente descontinuado no Python 3.3, tambémabstractproperty
. docs.python.org/3/library/abc.html