0

Итак, начну с кода:

>>> class CountFromBy:
>>>   pass

>>> a = CountFromBy()
>>> a
<__main__.CountFromBy object at 0x0000025F135BD630>

А теперь вопрос: что это такое ↑ ? По идее должно вывести "0", но выводит это. Прежде, чем кидать в меня помидоры, объясните пожалуйста, почему так происходит и как это исправить?

Вот почему я считаю, что должно быть "0"скрин из книги "Изучаем программирование на Python"

И ещё один интересный момент: если написать

>>> a.increase()

В выводе отобразиться следующее:

Traceback (most recent call last):
  File "<pyshell#5>", line 1, in <module>
    a.increase()
AttributeError: 'CountFromBy' object has no attribute 'increase'
  • 2
    Вы инициализировали переменную объектом. Для вашего объекта не задано, как он будет выглядеть при преобразовании к строке (для вывода на экран). Поэтому просто пишется, что это такой-то объект, расположенный по такому-то адресу в памяти. Откуда должен появиться 0 совершенно не понятно. – insolor Aug 22 '18 at 16:39
  • 2
    А расскажите, почему вы решили, что должен быть 0? – andreymal Aug 22 '18 at 16:56
  • Обновил вопрос, думаю теперь ясно, почему я считаю, что должно быть "0" – Jack Porfavore Aug 22 '18 at 17:14
  • 1
    Там справа написано что класс еще не создан... – Pavel Durmanov Aug 22 '18 at 17:19
  • @JackPorfavore, из текста "посмотрим, что класс должен делать (когда мы напишем код)" - т.е. это запланированное поведение, а не фактическое. – insolor Aug 22 '18 at 17:21
  • @insolor Возможно. Но на протяжении всей книги я всё повторял за автором(то есть писал код в IDLE в точности как и в книге) и в итоге я получал тот же результат, что и автор. Другими словами запланированное поведение перетекало в фактическое и на практике всё работало. Кроме этого случая. И потом, код в итоге выполняется, но вместо ожидаемого(мною) "0" выходит "<main.CountFromBy object at 0x0000025F135BD630>" И, помимо первой проблемы, почему не работает метод increase? – Jack Porfavore Aug 22 '18 at 18:01
  • @JackPorfavore "почему не работает метод increase?" - по той же причине, он еще не написан. – insolor Aug 22 '18 at 18:03

1 Answers1

2

Такой пустой класс:

class CountFromBy:
    pass

Ничего не делает. При выводе объекта класса просто выводится, что это объект такого-то класса, объявленного в таком-то модуле, и что он расположен по такому адресу:

<__main__.CountFromBy object at 0x0000025F135BD630>

Ожидать, что пустой класс будет выполнять какие-то полезные функции - это все равно что от пустого ящика ожидать, что он будет работать как телевизор: что-то показывать, и каналы будут переключаться.

Чтобы объект класса работал как описано в книге, нужно инициализировать начальное значение, заменить метод __repr__ (или __str__) по-умолчанию (какой из них переопределять в данному случае не важно, но на будущее почитайте ответы к вопросу Чем отличается __repr__ от __str__?), определить метод increase.

Пример класса с требуемым поведением:

class CountFromBy:
    def __init__(self, from_=0, by=1):
        self.value = from_
        self.by = by

    def __str__(self):
        return str(self.value)

    def increase(self):
        self.value += self.by

from_ с подчеркиванием, т.к. from - это ключевое слово, его нельзя использовать в качестве идентификатора.

insolor
  • 49,104