Проблема в том, что когда вы назначаете что-то для fahrenheit
, метод __set__()
для Fahrenheit
делегирует instance.celsius
.Все методы Celsius
конвертируются в float
.Если вы хотите, чтобы ваши примеры работали так, как вы ожидаете, вам потребуется Celsius
для делегирования instance.fahrenheit
вместо этого, при этом все еще выполняются преобразования float
, возможно, только в __get__()
, если вы этого хотите.
Итак, чтобы подвести итог, сохраните в типе Fahrenheit
без преобразования типов и делегируйте Fahrenheit
из Celsius
.
Как отметили некоторые другие, ваш дескриптор делает это так, чтобы всеэкземпляры Temperature
будут хранить то же значение.Если вы хотите, чтобы разные экземпляры содержали разные значения, вам нужно сохранить значение либо непосредственно в экземпляре под другим именем (обычно это будет _fahrenheit
в этой ситуации), либо в виде словаря, в котором ключinstance
.
Наконец, для такой ситуации, когда есть значение, разделяемое между двумя дескрипторами, и они вряд ли будут использоваться где-то еще, я бы пошел по маршруту property
.