So I think this is somewhat backwards.

The way I would think of this being used is something where the user/experimenter is calling the constructor (from code or from YAML). e.g.

```python
RectifiedLinear('h0', ..., ..., ..., weight_constraints=[NormConstraint(max_norm=5)])
```
or the equivalent YAML. Or something like that.

The user should not have to specify axes or `dimshuffle_pattern` (it's still not clear to me why `dimshuffle_pattern` is needed) -- that stuff should be provided by the layer or model or whatever when it calls the appropriate methods of the `NormConstraint` object. (I think this is the appropriate direction of flow of control in the interest of keeping the same constraint objects working with a heterogeneous group of models -- the `Constraint` knows how to constrain parameters, and it's up to the model/layer/whatever to decide how that knowledge gets used. It's very likely that it'll be used similarly across e.g. all existing subclasses of `Layer`, so a base class method is an appropriate way to deal with it.)

What the constructor **should** take and store as object state is the hyperparameters it needs to do its job, i.e. `max_norm`, `min_norm`.