Do you write programs in Python? You should be using attrs.
Why, you ask? Don’t ask. Just use it.
Okay, fine. Let me back up.
But Python is not without its problems. In some cases it encourages you to do the wrong thing. Particularly, there is a deeply unfortunate proliferation of class inheritance and the God-object anti-pattern in many libraries.
One cause for this might be that Python is a highly accessible language, so less experienced programmers make mistakes that they then have to live with forever.
But I think that perhaps a more significant reason is the fact that Python sometimes punishes you for trying to do the right thing.
The “right thing” in the context of object design is to make lots of small, self-contained classes that do one thing and do it well. For example, if you notice your object is starting to accrue a lot of private methods, perhaps you should be making those “public”1 methods of a private attribute. But if it’s tedious to do that, you probably won’t bother.