Dans mon application Python, je souhaite créer une méthode à la fois un staticmethod
et un abc.abstractmethod
. Comment puis-je faire cela?
J'ai essayé d'appliquer les deux décorateurs, mais cela ne fonctionne pas. Si je fais ceci:
import abc
class C(object):
__metaclass__ = abc.ABCMeta
@abc.abstractmethod
@staticmethod
def my_function(): pass
J'obtiens une exception *, et si je fais ceci:
class C(object):
__metaclass__ = abc.ABCMeta
@staticmethod
@abc.abstractmethod
def my_function(): pass
La méthode abstraite n'est pas appliquée.
Comment puis-je créer une méthode statique abstraite?
*L'éxéption:
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
la source
la source
Réponses:
la source
import abc
haut; ainsi qu'une sous-classe qui montre l'instanciation de A. (par exemple,class B(A):\n @staticmethod\n def test():\n print 10\n
)__isabstractmethod__
attribut.abstractstatic
être ajouté en amont àabc.py
?À partir de Python 3.3 , il est possible de combiner
@staticmethod
et@abstractmethod
donc aucune des autres suggestions n'est plus nécessaire:la source
@staticmethod
en premier, ou vous obtiendrezAttributeError: attribute '__isabstractmethod__' of 'staticmethod' objects is not writable
@property
Cela le fera:
Vous dites "Hein? Il renomme simplement @abstractmethod", et c'est tout à fait correct. Parce que toute sous-classe de ce qui précède devra de toute façon inclure le décorateur @staticmethod. Vous n'en avez pas besoin ici, sauf comme documentation lors de la lecture du code. Une sous-classe devrait ressembler à ceci:
Pour avoir une fonction qui vous obligerait à faire de cette méthode une méthode statique, vous devez sous-classer ABCmeta pour vérifier cela et l'appliquer. C'est beaucoup de travail sans retour réel. (Si quelqu'un oublie le décorateur @staticmethod, il obtiendra de toute façon une erreur claire, cela ne mentionnera tout simplement pas les méthodes statiques.
Donc, en fait, cela fonctionne aussi bien:
Mise à jour - Une autre façon de l'expliquer:
Le fait qu'une méthode soit statique contrôle la façon dont elle est appelée. Une méthode abstraite n'est jamais appelée. Et la méthode statique abstraite est donc un concept assez inutile, sauf à des fins de documentation.
la source
Ce n'est actuellement pas possible dans Python 2.X, qui imposera uniquement à la méthode d'être abstraite ou statique, mais pas les deux.
Dans Python 3.2+, les nouveaux décorateurs
abc.abstractclassmethod
etabc.abstractstaticmethod
ont été ajoutés pour combiner leur application d'être abstrait et statique ou abstrait et une méthode de classe.Voir le problème Python 5867
la source
abstractclassmethod
etabstractstaticmethod
rapidement obsolète dans Python 3.3, ainsi queabstractproperty
. docs.python.org/3/library/abc.html