Найти - Пользователи
Полная версия: Объясните новичку
Начало » Python для новичков » Объясните новичку
1 2
panama555
Привет.
Читаю книгу Доусона “Программируем на 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)чем отличается статический метод от нестатического?
Я пытался разобраться сам, но, к сожалению, не нашёл пояснений в книге.
Автор вводит эти понятия как-бы “мимоходом” не поясняя их смысл.
Помогите, кто разобрался
py.user.next
panama555
Я не понял: 1) зачем нужно делать этот метод статическим?
Critter - это класс. Класс - это множество объектов, объединённых одним набором признаков. Таким образом операции с классом являются операциями над всем множеством объектов этого класса.

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

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

panama555
Зачем лишняя строка в программе.
Интерпретатору даётся указание сделать это метод другим внутри.
panama555
Вот теперь понял. Спасибо
Rodegast
> Класс - это множество объектов, объединённых одним набором признаков.

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

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

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

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

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

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

Да чего там читать, это хорошо известные вещи…
https://ru.wikipedia.org/wiki/тип_данных
https://ru.wikipedia.org/wiki/класс_(математика)
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB