J'ai un petit problème à décorer une méthode statique en Python. Je pense que le code suivant représente le mieux mon problème: Cela semble être un bug. J'imagine qu'il se pose parce que lorsque la méthode est-ce un True Bug dans la mise en œuvre du décorateur StaticMethod et / ou y a-t-il des solutions de contournement simples? J'ai pensé à écrire un décorateur à asignez un attribut foo.bar code> est transmise au décorateur, il s'agit d'une fonction, pas d'une méthode. C'est la seule raison pour laquelle je peux voir pour ne pas être appelable, car si nous décorions une fonction standard, il n'est pas appelable, comme indiqué ci-dessous. P>
__ __ code>, mais je ne sais pas comment
appelable code> est mis en œuvre, donc je ne peux pas évaluer la réussite d'une telle méthode . p> p>
3 Réponses :
Eh bien, si vous considérez cela un bug ou non, c'est documenté : p>
Méthode statique Les objets fournissent un moyen de vaincre la transformation de Objets de fonction aux objets de la méthode décrit ci-dessus. Une méthode statique objet est une enveloppe autour de tout autre objet, généralement une méthode définie par l'utilisateur objet. Lorsqu'un objet de méthode statique est extrait d'une classe ou d'une classe instance, l'objet est effectivement renvoyé est l'objet emballé, qui n'est pas sous réserve de toute nouvelle transformation. Les objets de méthode statique ne sont pas eux-mêmes appelables, bien que le Les objets qu'ils enveloppent sont généralement. Statique Les objets de la méthode sont créés par le Constructeur StaticMethod intégré (). P> blockQuote>
Méthodes sont em> fonctions. Mais staticmethod code> Les objets ne sont pas. Ils sont Descriptors , donc il y a une magie supplémentaire qui vous donne une appelable lorsque vous Accédez comme
cls.static_method code>, mais cette magie ne peut rien cacher lorsque vous utilisez (c.-à-d. Passer à décorateur)
static_method code> à l'intérieur du corps de
CLS code >. Vous ne pouvez pas vraiment pirater votre chemin autour de cela, du moins pas proprement. Une solution beaucoup plus simple est la réorganisation des décorateurs tels que
staticmethod code> est appliqué en dernier - c'est-à-dire le mettre au sommet, au-dessus de tous les autres décorateurs. P>
J'ai écrit ma propre implémentation de staticmethod code> que est appelable appelable et cela semble résoudre ce problème bien.
Notez que vous devez utiliser de nouvelles classes de style pour un
staticmethod code> à appeler également sur des instances, car cela utilise des descripteurs.
Pour le faire fonctionner, changez simplement l'ordre des descripteurs.