Когда, помимо использования self, функция должна быть статической?

Очень широкий вопрос, возможно, специфичный для Python.

Многие инструменты IDE, такие как PyCharm, предлагают добавлять декоратор @staticmethod к функциям, которые не содержат ссылок на self. Бывают ли случаи, когда функция не должна быть статической, даже если она не имеет ссылки на self?


person Olaf Szmidt    schedule 20.11.2017    source источник
comment
Наличие или отсутствие self не делает метод методом экземпляра; все методы являются методами экземпляра, если не украшены staticmethod или classmethod. Как только вы определили, какой тип метода у вас есть, можно предположить, что первый аргумент является экземпляром или классом (или просто обычным аргументом), независимо от его имени.   -  person chepner    schedule 20.11.2017
comment
@chepner Помимо потери доступа к self, когда вы объявляете staticmethod в Python, есть ли какие-либо другие опасности? Или это единственная разница между статическим методом и методом экземпляра. Вы можете игнорировать тот факт, что теперь он называется по-другому и т. д. Конечно, если у метода нет self, то это должно указывать на то, что это не метод экземпляра, верно? Так почему же PyCharm говорит, что это /может быть/ статический метод, а не должен быть? Нужны ли нам когда-нибудь методы экземпляра без self?   -  person Olaf Szmidt    schedule 20.11.2017
comment
@OlafSzmidt PyCharm говорит вам, что это может быть статическим методом, поскольку он не является обязательным, независимо от того, использует ли он self. Тебе решать. Одна из причин наличия метода экземпляра без self заключается в том, что вы в настоящее время не используете информацию об экземпляре, но думаете, что вам может понадобиться это в будущем. Еще одна вещь, которую следует учитывать, когда у вас есть staticmethod, — есть ли смысл переместить его из класса.   -  person Paulo Almeida    schedule 20.11.2017


Ответы (1)


Смысл объявления функции статической заключается в удалении доступа к параметрам self и cls.

Если функция должна ссылаться либо на класс, либо на объект, она не должна быть статической.

В противном случае не стесняйтесь украшать функцию @staticmethod.

person Evan Weissburg    schedule 20.11.2017