Не получение ожидаемого результата с использованием дескриптора в Python

#python #descriptor

#python #дескриптор

Вопрос:

Я новичок в Python…пробовал какой-то код с дескриптором и запускал приведенный ниже код, чтобы изменить градус Фаренгейта на Цельсий. Но я не получаю точный результат. Может кто-нибудь помочь, как это работает?

Попробовал приведенный ниже код

 import sys
import os

class Celsius:
    def __get__(self, obj, owner):
        return self.celsius

    def __set__(self, obj, value):
        self.celsius = (value-32)*5/9

class Temperature:
    celsius = Celsius()

    def __init__(self, f):
        self.fahrenheit = f

t1 = Temperature(32)
t1.celsius = 0

if __name__ == "__main__":
        t1 = Temperature(int(input()))
        print(t1.fahrenheit, t1.celsius)
  

Ожидаемый результат: (212, 100.0) (Согласно формуле)
фактический результат: (212, -17.77777777777778)
Как он вычисляет -17?

Комментарии:

1. Как? Отсюда: t1.celsius = 0 ; -32*5/9

Ответ №1:

Вы не должны инициализировать t1.celsius с помощью 0, но вместо этого используйте celsius установщик в Temperature.__init__ :

 class Temperature:
    celsius = Celsius()

    def __init__(self, f):
        self.fahrenheit = self.celsius = f
  

Демо-версия: https://repl.it/repls/UsableSunnyConfig

Комментарии:

1. Спасибо за быстрый response…it работает сейчас … но почему мы присваиваем градус Фаренгейта celsius…..it должен проходить через объект / класс Celsius?

2. Рад быть полезным. Это потому, что вы создали Celsius установщик класса дескриптора для преобразования градуса Фаренгейта в градус Цельсия. Мы присваиваем градус Фаренгейта цельсию, чтобы фактически использовать этот параметр.

Ответ №2:

 t1.celsius = 0
  

Это ваша ошибка. Вы создаете класс Celsius с нулевым значением, поэтому установщик устанавливает (0 — 32) * 5/9, то есть — 17.777777777778

Комментарии:

1. Также передайте значение классу Celsius, когда вы принимаете его во входных данных

2. Пожалуйста, добавьте в свой ответ.

Ответ №3:

Вот простой менеджер температуры, который обрабатывает параметры: Кельвин, Фаренгейт, Цельсий

 class Temperature:
    def __init__(self, value, unit='C'):
        self.value = value
        if unit.upper() in ['C', 'F', 'K']:
            self.unit = unit.upper()
        else:
            raise ValueError('Unit must be C|F|K')

    @property
    def kelvin(self):
        if self.unit == 'K':
            return self.value
        elif self.unit == 'C':
            return self.value - 273.15
        else:
            return (self.value - 273.15) * 9 / 5   32

    @property
    def celsius(self):
        if self.unit == 'C':
            return self.value
        elif self.unit == 'K':
            return self.value   273.15
        else:
            return (self.value * 9 / 5)   32

    @property
    def fahrenheit(self):
        if self.unit == 'F':
            return self.value
        elif self.unit == 'C':
            return (self.value - 32) * 5 / 9
        else:
            return (self.value - 32) * 5 / 9   273.15


t = Temperature(7,'k')
print(t.fahrenheit)