Уведомления

Группа в Telegram: @pythonsu

#1 Окт. 7, 2019 17:42:30

panama555
Зарегистрирован: 2019-02-19
Сообщения: 175
Репутация: +  4  -
Профиль   Отправить e-mail  

Объясните новичку

Привет.
Читаю книгу Доусона “Программируем на Phyton” 2013
на стр.230 такой пример:

 class Critter():
    total = 0
    @staticmethod #декоратор
    def status () :
        print("\nBcero зверюшек сейчас" . Critter.total)
    def __init__ (self, name):
        рrint("Появилась на свет новая зверюшка!")
        self.name = name
        Critter.total += 1
# основная часть
crit1= Сrittеr("зверюшка 1")
crit2 = Сrittеr("зверюшка 2")
critЗ = Сrittеr("зверюшка 3")
Critter.status()
print(crit1 .total) 

Автор поясняет, что в программе он создаёт атрибут класса (total), метод конструктор (__init__), метод класса (status)
Здесь всё понятно.
Но автор уточняет, что метод status является “статическим” методом, т.к. он поставил перед его объявлением
декоратор “@staticmethod ”
Я не понял: 1) зачем нужно делать этот метод статическим?(если уберу декоратор - всё нормально работает)
2)чем отличается статический метод от нестатического?
Я пытался разобраться сам, но, к сожалению, не нашёл пояснений в книге.
Автор вводит эти понятия как-бы “мимоходом” не поясняя их смысл.
Помогите, кто разобрался

Отредактировано panama555 (Окт. 7, 2019 17:43:48)

Офлайн

#2 Окт. 7, 2019 20:02:05

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 10024
Репутация: +  857  -
Профиль   Отправить e-mail  

Объясните новичку

panama555
Я не понял: 1) зачем нужно делать этот метод статическим?
Critter - это класс. Класс - это множество объектов, объединённых одним набором признаков. Таким образом операции с классом являются операциями над всем множеством объектов этого класса.

panama555
2)чем отличается статический метод от нестатического?
Статический метод не требует наличия даже одного объекта класса. У него нет self. Такие методы либо относятся как-то к классу по смыслу и не требуют объектов этого класса, либо используют данные обо всём множестве объектов, хранимые прямо в классе как в объекте.

Здесь переменная total не относится к какому-то одному объекту класса Critter. Она относится сразу ко всему множеству объектов класса Critter, описывая их все. Поэтому и чтение этой переменной выполняется методом, который работает сразу со всем множеством объектов класса, а не с каким-то одним объектом этого класса. Из-за этого метод вызывается даже не у какого-то объекта класса, а у самого класса как у объекта, хранящего поле total.



Отредактировано py.user.next (Окт. 7, 2019 20:02:41)

Офлайн

#3 Окт. 7, 2019 20:29:37

panama555
Зарегистрирован: 2019-02-19
Сообщения: 175
Репутация: +  4  -
Профиль   Отправить e-mail  

Объясните новичку

Видимо я не очень акцентировал смысл вопроса.
попробую ещё раз.
Я понял, что в программе присутствует метод (status) который относится ко всему классу, а не к экземплярам класса. Поэтому в его параметрах не нужно указывать параметр self.
Я не про это спрашивал. Автор объяснил почему и зачем.
Я не пойму зачем автор написал строку: @staticmethod
Он пишет, что эта строка является декоратором и именно поэтому метод status будет статическим
Поэтому у меня возникли вопросы, которые можно свести к одному:
зачем нужно писать строку @staticmethod (если, как вы утверждаете, метод является статическим если он относится к классу, а не к экземплярам класса)? К тому же, если я удалю эту строку из программы - ничего не изменится. Программа работает корректно. Поэтому: зачем нужна строка: @staticmethod?
Казалось бы: не указывай в параметрах self и этого достаточно. Метод уже статический. Зачем лишняя строка в программе.
Неужели эта строчка для того, чтобы напомнить программисту, который будет её читать и редактировать в будущем, что “этот метод статический. НЕ ЗАБУДЬ!”

Офлайн

#4 Окт. 7, 2019 20:54:41

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 10024
Репутация: +  857  -
Профиль   Отправить e-mail  

Объясните новичку

panama555
К тому же, если я удалю эту строку из программы - ничего не изменится. Программа работает корректно.
Проверь на такой строке (удали декоратор и запусти)
  
crit1.status()

panama555
Зачем лишняя строка в программе.
Интерпретатору даётся указание сделать это метод другим внутри.



Отредактировано py.user.next (Окт. 7, 2019 20:55:05)

Офлайн

#5 Окт. 7, 2019 21:59:16

panama555
Зарегистрирован: 2019-02-19
Сообщения: 175
Репутация: +  4  -
Профиль   Отправить e-mail  

Объясните новичку

Вот теперь понял. Спасибо

Офлайн

#6 Окт. 7, 2019 23:27:50

Rodegast
От: Пятигорск
Зарегистрирован: 2007-12-28
Сообщения: 2849
Репутация: +  186  -
Профиль   Отправить e-mail  

Объясните новичку

> Класс - это множество объектов, объединённых одним набором признаков.

Не совсем так, сам класс не является множеством, а определяет его. Множеством является тип данных

> зачем нужно делать этот метод статическим?(если уберу декоратор - всё нормально работает)
> чем отличается статический метод от нестатического?

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



С дураками и сектантами не спорю, истину не ищу.
Ели кому-то правда не нравится, то заранее извиняюсь.

Офлайн

#7 Окт. 8, 2019 00:53:11

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 10024
Репутация: +  857  -
Профиль   Отправить e-mail  

Объясните новичку

Rodegast
Не совсем так, сам класс не является множеством, а определяет его. Множеством является тип данных
Класс - это множество объектов, обладающих одинаковым набором признаков. И “класс” - это понятие из парадигмы ООП, как и “объект”. А Python уже имплементирует эти понятия из ООП своим способом. Так что нельзя путать класс в контексте ООП и класс в контексе питона. Семантика класса в питоне не равна семантике класса в ООП-парадигме.

Если поизучаешь UML, там вот как раз понятие класса из объектно-ориентированной парадигмы взято. Поэтому-то так сложно UML-диаграмму классов переводить на питон - в питоне есть не все конструкции для реализации классов и многие приходится додумывать в стиле “предположим, что у нас здесь отмечено, что это такая-то штука”. Это из той же оперы что и интерфейсы, которых в питоне нет, но так они вообще есть и участвуют в полиморфизме.

Например, классы могут находится в отношении агрегации, а могут находиться в отношении композиции. Вот попробуй записать эти два отношения между классами на питоне. Максимум, ты сможешь это выразить на объектах классов, но не на самих классах. А отношения между объектами и отношения между классами - это разные вещи. К тому же бывают не только бинарные отношения между классами, но и тернарные. И сами отношения могут рассматриваться как классы, то есть внутри отношения могут быть поля. Питон нихрена из этого не выражает даже близко, приходится искать обходные пути или вообще отказываться от всей мощи ООП.



Офлайн

#8 Окт. 8, 2019 10:59:30

Rodegast
От: Пятигорск
Зарегистрирован: 2007-12-28
Сообщения: 2849
Репутация: +  186  -
Профиль   Отправить e-mail  

Объясните новичку

> Класс - это множество объектов, обладающих одинаковым набором признаков

Нет! Множеством является тип данных, а класс его определяет. К питону это прямого отношения не имеет.



С дураками и сектантами не спорю, истину не ищу.
Ели кому-то правда не нравится, то заранее извиняюсь.

Отредактировано Rodegast (Окт. 8, 2019 11:49:36)

Офлайн

#9 Окт. 9, 2019 04:47:53

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 10024
Репутация: +  857  -
Профиль   Отправить e-mail  

Объясните новичку

Rodegast
Нет! Множеством является тип данных, а класс его определяет.
Подожду, пока ты не прочитаешь какие-нибудь книжки. Потом уже будем дискутировать.



Офлайн

#10 Окт. 9, 2019 11:30:02

Rodegast
От: Пятигорск
Зарегистрирован: 2007-12-28
Сообщения: 2849
Репутация: +  186  -
Профиль   Отправить e-mail  

Объясните новичку

> Подожду, пока ты не прочитаешь какие-нибудь книжки. Потом уже будем дискутировать.

Да чего там читать, это хорошо известные вещи…
https://ru.wikipedia.org/wiki/тип_данных
https://ru.wikipedia.org/wiki/класс_(математика)



С дураками и сектантами не спорю, истину не ищу.
Ели кому-то правда не нравится, то заранее извиняюсь.

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version