#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)