Method may be static python что значит
Перейти к содержимому

Method may be static python что значит

  • автор:

Объясните пожалуйста причину происходящего [Django Admin @staticmethod]?

Как видите добавилось поле с факультетом
d1baa32aff8d47aebd86611b29c9fc00.jpeg

Всё хорошо. Всё подходит. Но тут PyCharm подсказывает такую вещь:
Method ‘get_faculty_name’ may be ‘static’ less. (Ctrl+F1 Alt+T)
This inspection detects any methods which may safely be made static.

Русские Блоги

Каждый также столкнется с этой проблемой при разработке Python (как показано на рисунке: под именем метода есть кривая, которая влияет на эстетику. Обсессивно-компульсивное расстройство указывает на то, что его нельзя терпеть.)

Так в чем же причина?

Это потому, что методы, которые мы объявляем в классе, не используют переменные в классе. Взяв приведенную выше картинку в качестве примера, мы Test Этот класс объявляет hello_world Метод, и этот метод не использует переменные в классе (переменные в этом классе ab ), наведите курсор мыши на кривую, чтобы увидеть причину.

Это говорит нам о том, что это статический метод и может быть безопасно объявлен как статический тип.

Метод заключается в следующем: удалите self в статическом методе, а затем объявите его в предыдущей строке этого метода. (Сравните изменения на верхнем и нижнем рисунках.)

Python: статические методы, методы класса и экземпляра класса

not eisenheim

Согласно модели данных Python, язык предлагает три вида методов: статические, класса и экземпляра класса. Давайте посмотрим, что же происходит за кулисами каждого из видов методов. Понимание принципов их работы поможет в создании красивого и эффективного кода. Начнём с самого простого примера, в котором демонстрируются все три вида методов.

Методы экземпляра класса

Это наиболее часто используемый вид методов. Методы экземпляра класса принимают объект класса как первый аргумент, который принято называть self и который указывает на сам экземпляр. Количество параметров метода не ограничено.

Используя параметр self , мы можем менять состояние объекта и обращаться к другим его методам и параметрам. К тому же, используя атрибут self.__class__ , мы получаем доступ к атрибутам класса и возможности менять состояние самого класса. То есть методы экземпляров класса позволяют менять как состояние определённого объекта, так и класса.

Встроенный пример метода экземпляра — str.upper() :

Методы класса

Методы класса принимают класс в качестве параметра, который принято обозначать как cls . Он указывает на класс ToyClass, а не на объект этого класса. При декларации методов этого вида используется декоратор classmethod .

Методы класса привязаны к самому классу, а не его экземпляру. Они могут менять состояние класса, что отразится на всех объектах этого класса, но не могут менять конкретный объект.

Встроенный пример метода класса — dict.fromkeys() — возвращает новый словарь с переданными элементами в качестве ключей.

Статические методы

Статические методы декларируются при помощи декоратора staticmethod . Им не нужен определённый первый аргумент (ни self , ни cls ).

Их можно воспринимать как методы, которые “не знают, к какому классу относятся”.

Таким образом, статические методы прикреплены к классу лишь для удобства и не могут менять состояние ни класса, ни его экземпляра.

С теорией достаточно. Давайте разберёмся с работой методов, создав объект нашего класса и вызвав поочерёдно каждый из методов: instancemethod, classmethod and staticmethod.

Пример выше подтверждает то, что метод instancemethod имеет доступ к объекту класса ToyClass через аргумент self . Кстати, вызов функции obj.instancemethod() используется лишь для удобства, то есть можно использовать и ToyClass.instancemethod(obj) .

Теперь давайте вызовем метод класса:

Мы видим, что метод класса classmethod() имеет доступ к самому классу ToyClass, но не к его конкретному экземпляру объекта. Запомните, в Python всё является объектом. Класс тоже объект, который мы можем передать функции в качестве аргумента.

Заметьте, что self и cls — не обязательные названия и эти параметры можно называть иначе.

Это лишь общепринятые обозначения, которым следуют все. Тем не менее они должны находиться первыми в списке параметров.

Вызовем статический метод:

Да, это может вас удивить, но статические методы можно вызывать через объект класса. Вызов через точку нужен лишь для удобства. На самом же деле в случае статического метода никакие аргументы ( self или cls ) методу не передаются.

То есть статические методы не могут получить доступ к параметрам класса или объекта. Они работают только с теми данными, которые им передаются в качестве аргументов.

Теперь давайте вызовем те же самые методы, но на самом классе.

Метод класса и статический метод работают, как нужно. Однако вызов метода экземпляра класса выдаёт TypeError, так как метод не может получить на вход экземпляр класса.

Теперь, когда вы знаете разницу между тремя видами методов, давайте рассмотрим реальный пример для понимания того, когда и какой метод стоит использовать. Пример взят отсюда.

Когда использовать каждый из методов?

Выбор того, какой из методов использовать, может показаться достаточно сложным. Тем не менее с опытом этот выбор делать гораздо проще.

Чаще всего метод класса используется тогда, когда нужен генерирующий метод, возвращающий объект класса. Как видим, метод класса from_birth_year используется для создания объекта класса Person по году рождения, а не возрасту.

Статические методы в основном используются как вспомогательные функции и работают с данными, которые им передаются.

Why does PyCharm propose to change method to static?

The new pycharm release (3.1.3 community edition) proposes to convert the methods that don’t work with the current object’s state to static.

enter image description here

What is the practical reason for that? Some kind of micro-performance(-or-memory)-optimization?

10 Answers 10

PyCharm «thinks» that you might have wanted to have a static method, but you forgot to declare it to be static (using the @staticmethod decorator).

PyCharm proposes this because the method does not use self in its body and hence does not actually change the class instance. Hence the method could be static, i.e. callable without passing a class instance or without even having created a class instance.

Agreed with @jolvi, @ArundasR, and others, the warning happens on a member function that doesn’t use self .

If you’re sure PyCharm is wrong, that the function should not be a @staticmethod , and if you value zero warnings, you can make this one go away two different ways:

Workaround #1

Workaround #2 [Thanks @DavidPärsson]

The application I had for this (the reason I could not use @staticmethod) was in making a table of handler functions for responding to a protocol subtype field. All handlers had to be the same form of course (static or nonstatic). But some didn’t happen to do anything with the instance. If I made those static I’d get «TypeError: ‘staticmethod’ object is not callable».

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *