Из своего любительского опыта знаю, что иногда находишь "правильное" решение, т.е. специальный модуль или библиотеку, но они бывают настолько сложны, что кажется, что проще что-то самому создать, чем разобраться с ними. Например, хотел как-то разобраться с поддержкой utf-8 в C/C++. На stackoverflow было сказано, что можно делать как-то по-простому, через w_char или что-то в этом роде. Потом один говорит, что для простых случаев это подходит, но, тем не менее, иногда будут ошибки, например, немецкая ß неправильно делается, если хочешь получить ее заглавной. Но есть-де какая-то там библиотека, которая все корректно делает. Но на том же stackoverflow люди жаловались, что эта библиотека не для средних умов.
А по поводу создания собственных классов, так это больше для удовольствия. Мы ведь здесь (по крайней мере в этой теме) не то чтобы ищем готовое решение, а больше для изучения.
Или вот, например, понадобится мне тип данных, чтобы составлять или решать кроссворды. Так можно будет этот класс доработать. Например, добавить метод, скажем, insert, который будет вставлять слово в кроссворд. Скажем, синтаксис будет такой:
t.insert(x, y, word, direction)
По х и у задается начальная ячейка. word это, понятно, слово, которое нужно вставить. А это будет задавать направление: 'up', 'down', 'left', 'right'. Если слово вставить нельзя, например, выходит за границы или пересекает другое слово, а буква при пересечении не совпадает, то будет выдавать соответствующий код.
Или, скажем, есть такие кроссворды-матрицы, где нужно отыскать слова в них и вычеркнуть. Тоже можно приспособить этот класс. И т.п. Все это больше для развлечения и обучения. А обучаться лучше на интересных примерах. Мне, например, если бы читать примеры из бухгалтерии с дебитами, кредитами, сальдо и процентами (как вспомню программистов с бывшей работы, работавших с 1С, так вздрогну), то я бы, скорее всего, ничего бы не освоил. Кстати, поэтому мне и нравится книга Think Python.