Python 2.7 Combiner abc.abstractmethod et classmethod
Comment puis-je créer un décorateur pour un résumé de la méthode de classe en Python 2.7?
Oui, ce qui est similaire à cette question, sauf que je voudrais combiner abc.abstractmethod
et classmethod
, au lieu de staticmethod
. Aussi, il ressemble abc.abstractclassmethod
était ajouté en Python 3 (je crois?), mais je suis en utilisant Google App Engine, donc je suis actuellement limitée à Python 2.7
Merci d'avance.
- Si vous ne pouvez pas utiliser abc.abstractclassmethod, puis comment la question de comment le combiner avec un autre décorateur même surviennent?
- Pense que vous avez mal lu: abc.abstractclassmethod = abc.abstractmethod + classmethod. Python 2.7 a abstractmethod et classmethod, mais pas abstractclassmethod
- Je suis confronté exactement le même problème! Bonne question!
Vous devez vous connecter pour publier un commentaire.
Voici un exemple de travail dérivé à partir du code source en Python 3.3 du abc module:
Voici à quoi il ressemble lors de l'exécution:
Noter que le dernier exemple échoue parce que
cls()
de ne pas instancier. ABCMeta empêche prématurée de l'instanciation de classes qui n'ont pas été définis tous les méthodes abstraites.Une autre façon de déclencher un échec lors de la from_int() classe abstraite méthode est appelée consiste à soulever une exception:
La conception ABCMeta ne fait aucun effort pour empêcher toute méthode abstraite d'être appelé sur un uninstantiated classe, donc c'est à vous de déclencher un échec en invoquant
cls()
comme classmethods généralement de faire, ou en augmentant un NotImplementedError. De toute façon, vous obtenez une belle, propre échec.Il est sans doute tentant d'écrire un descripteur pour intercepter un appel direct à un résumé de la méthode de classe, mais qui serait en contradiction avec la conception globale de ABCMeta (ce qui est tout au sujet de la vérification pour les méthodes requises avant l'instanciation plutôt que lorsque les méthodes sont appelées).
classmethod
, suivie parabc.abstractmethod
, ce n'est pas l'application deabstractmethod
. c'est à dire que je peux toujours appeler la méthode.cls()
.DemoABC()
ci-dessus. Le ABCMeta métaclasse vérifier l'intégralité dutodo-list
de abstractmethods avant l'instanciation.DemoConcrete.from_int()
avecdef from_int(self, n): return n
sans@classmethod
décorateur, etDemoConcrete.from_int()
fonctionne encore très bien.Une autre solution possible:
Maintenant, on ne peut toujours pas instancier à partir d'Un jusqu'à ce que "some_classmethod' est mis en œuvre, et cela fonctionne si vous la mettre en œuvre avec un classmethod.
J'ai récemment rencontré le même problème. C'est, il me fallait un résumé classmethods, mais a été incapable d'utiliser Python 3 en raison d'autres contraintes du projet. La solution que j'ai trouvé est la suivante.
abcExtend.py:
Utilisation:
Et voici quelques pyunit tests qui donnent une plus exhaustive de démonstration.
testAbcExtend.py:
Je n'ai pas évalué le coût de cette solution, mais cela a fonctionné pour ma part jusqu'à présent.