在Python中使用描述符未得到预期的结果

时间:2019-03-23 12:35:33

标签: python descriptor

我是Python的新手...正在尝试使用Descriptor编写一些代码,并在下面的代码下运行以将华氏温度更改为摄氏温度。 但是我没有得到确切的结果。可以帮忙吗,如何运作?

尝试以下代码

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?

3 个答案:

答案 0 :(得分:0)

t1.celsius = 0

这是您的错误。您正在使用零值创建摄氏类,因此设置器将设置(0-32)* 5/9,即-17.777777777778

答案 1 :(得分:0)

您不应将t1.celsius初始化为0,而应使用celsiusTemperature.__init__的setter:

class Temperature:
    celsius = Celsius()

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

演示:https://repl.it/repls/UsableSunnyConfig

答案 2 :(得分:0)

这是一个简单的温度管理器,可处理:Kelvin,Fahrenheit,Celsius的对话

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)