Quando provo a usare un metodo statico all'interno del corpo della classe e definisco il metodo statico usando la staticmethod
funzione integrata come decoratore, in questo modo:
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
Ottengo il seguente errore:
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
Capisco perché ciò sta accadendo (associazione del descrittore) e posso aggirare il problema convertendolo manualmente _stat_func()
in un metodo statico dopo il suo ultimo utilizzo, in questo modo:
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
Quindi la mia domanda è:
Ci sono modi migliori, come quelli più puliti o più "Pythonic", per farlo?
staticmethod
affatto. Di solito sono più utili come funzioni a livello di modulo, nel qual caso il tuo problema non è un problema.classmethod
, d'altra parte ...