Those are good points, John. Besides making it more obvious how to find the code, the reason I think printing belongs in the object is that it necessarily involves looking in the guts at the detailed state. (There are times when you want to print different amounts of information depending on who's asking, but I think the way to detect that is by using different messages to ask.) If you have mirrors (really should be lenses or windows) then they have to ask the object for the information anyway, and so you've reduced to the previous problem anyway. The object itself is the only thing that can really know enough to construct a reasonable representation.
I didn't understand what you meant in your last line:
mirrors are a lot like views, which are considered bad (at least in the UI)
I thought that the idea of Views as in MVC was still considered to be a good one. Having objects that are in charge of knowing how to display others that respond to a given protocol (or can be made to by some mediating object) is a real win. Are you talking about some other facet of the idea of views, or are there more recent evaluations of the general idea that I haven't seen yet?