Lorsque j'essaie d'utiliser une méthode statique à partir du corps de la classe et que je définis la méthode statique en utilisant la staticmethod
fonction intégrée en tant que décorateur, comme ceci:
class Klass(object):
@staticmethod # use as decorator
def _stat_func():
return 42
_ANS = _stat_func() # call the staticmethod
def method(self):
ret = Klass._stat_func() + Klass._ANS
return ret
J'obtiens l'erreur suivante:
Traceback (most recent call last):<br>
File "call_staticmethod.py", line 1, in <module>
class Klass(object):
File "call_staticmethod.py", line 7, in Klass
_ANS = _stat_func()
TypeError: 'staticmethod' object is not callable
Je comprends pourquoi cela se produit (liaison de descripteur) , et je peux le contourner en convertissant manuellement _stat_func()
en une méthode statique après sa dernière utilisation, comme ceci:
class Klass(object):
def _stat_func():
return 42
_ANS = _stat_func() # use the non-staticmethod version
_stat_func = staticmethod(_stat_func) # convert function to a static method
def method(self):
ret = Klass._stat_func() + Klass._ANS
return ret
Ma question est donc:
Y a-t-il de meilleures façons, par exemple, plus propres ou plus «pythoniques», d'accomplir cela?
staticmethod
du tout. Ils sont généralement plus utiles en tant que fonctions au niveau du module, auquel cas votre problème n'est pas un problème.classmethod
, d'autre part ...