which does allow me to create individuals with the range 10 <= value <= 100 but I need other individuals with different ranges. Changing indv.min and indv.max after the indv is created obvisouly does not update the ConstrainedDatatype (verified with reasoner). The MyValue class does have other properties but are not relevant for the example.
I know new classes can be created dynamically:
class has_value(DataProperty, FunctionalProperty):
range = [ConstrainedDatatype(float, min_inclusive = CValue.has_min, max_inclusive = CValue.has_max)]
The DataProperty is created with the min_inclusive given at that time; if CValue.has_min change later, it will not be updated.
I'm not sure that what you want to achieve can be done in OWL, because OWL definition corresponds to a single free variable, while you need two here (one for the dataproperty and one for the CValue). Possibly, you should look at SWRL rules, which support several free variables. You may create a rule limiting the range of the float value, by classifying any individual having a non satisfying value as Nothing.