I don't think private is very useful either. It can be useful in some special cases: E.g. when you implement a simple cache using a mapping and you have to do some locking (or rely on the interpreter lock). In that case it can be good to declare the mapping itself private, so that you _know_ that the only access to it is right there, through the lookup/set functions you provide. Those access functions are probably protected.