Для начала о том, зачем вообще нужна конструкция return self. Обычно её используют, чтобы сделать возможным так называемый chaining, то есть код вида my_object.method().another_method().do_something(). Но, как мы видим из заголовка статьи, в стандартной библиотеке Python это не используется. Точнее, используется, но не всегда.
Для меня этот факт выглядит вполне естественным, хотя я никогда не думал о причинах. А вот тех, кто больше привык с другим языкам программирования, это подбешивает.
И все же, почему в Python разрешено делать line = line.strip().lower(), а line.reverse().sort() нельзя?
Оказалось у Гвидо есть письмо на этот счет: мутирующие методы должны возвращать None. Тогда код выше будет выглядеть как
line.reverse()
line.sort()
Это явно дает понять что методы мутирующие. А my_object.method().another_method().do_something() возможно только в том случае, если методы возвращают копию или новые объекты.
Стандартная библиотека Python придерживается такого соглашения, и мы тоже должны.