You override getattr and setattr when you want to do something extra when the class user gets or sets an attribute. For example:
1) you might avoid raising an exception when user manipulates an invalid attribute, so you just return None for an unknown attribute.
2) attribute manipulations are actually forwarded/delegated, so the valid attributes are not known in advance e.g. a class that represents a database row and the user manipulates columns as attributes. I need to run-time check if the given attribute name matches column name, and perhaps I'd like to forgive upper-case/lower-case differences etc.
Another thing, containment is sometimes preferred to subclassing. Instead of inheriting from a dict, you could create a class that contains a dict.