При интеграции приложения Django, которое я раньше не использовал, я нашел два разных способа определения функций в классах. Автор, кажется, использует их оба очень преднамеренно. Первый из них является один я сам использую много:Когда мне следует использовать метод @classmethod и метод def (self)?
class Dummy(object):
def some_function(self,*args,**kwargs):
do something here
self is the class instance
Другой является один я не использую, в основном потому, что я не понимаю, когда использовать его, а зачем:
class Dummy(object):
@classmethod
def some_function(cls,*args,**kwargs):
do something here
cls refers to what?
В Документах Python classmethod
декоратора объясняется с этим предложением:
метод класса получает класс в качестве неявного первого аргумента, так же, как метод экземпляра получает экземпляр.
Так что я думаю cls
относится к Dummy
сам (в class
, а не экземпляра). Я не совсем понимаю, почему это существует, потому что я всегда мог бы сделать это:
type(self).do_something_with_the_class
Является ли это только ради ясности, или же я скучаю по наиболее важной частью: пугающие и захватывающие вещи, которые не могут быть без него?
Ницца: Мне нравится, когда ответ разбивается на то, как - почему. Насколько я понял, @classmethod позволяет получить доступ к функции без необходимости в экземпляре. Это именно то, что я искал, спасибо. – marue
@marue Добро пожаловать! – Marcin
Я бы сказал, что методы вызова класса в экземплярах - это плохой стиль кодирования - просто нет причин для этого и может вызвать только путаницу. Но да, это работает (java позволяет то же самое, но выдает предупреждение компиляции при вызове статических методов через экземпляры) – Voo