I'm not sure what I think of this. It's a bit too much the opposite of what you first proposed: all the liblinear estimators have parameters `tol`, `C`, `fit_intercept`, `intercept_scaling`, `random_state`. This implementation would suggest they share nothing, and then when you come to `LibLinearMixin.fit` it assumes the presence of all of these attributes, but you have to look in a completely different place to see that they were set. I think that's also an indicator of bad OOP design.

But I think @larsmans should comment on design patterns.