Kiedy próbuję użyć metody statycznej z treści klasy i zdefiniować metodę statyczną za pomocą funkcji wbudowanej staticmethod
jako dekoratora, na przykład:
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
Otrzymuję następujący błąd:
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
Rozumiem, dlaczego tak się dzieje (wiązanie deskryptora) i mogę to obejść, ręcznie konwertując _stat_func()
na metodę statyczną po jej ostatnim użyciu, na przykład:
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
Więc moje pytanie brzmi:
Czy są lepsze, jak w czystszym lub bardziej „Pythonic”, sposoby osiągnięcia tego celu?
staticmethod
. Zwykle są bardziej przydatne jako funkcje na poziomie modułu, w takim przypadku twój problem nie jest problemem.classmethod
, z drugiej strony ...