首页 > 解决方案 > Python温度类转换器(K,F,C)

问题描述

这就是我正在尝试做的事情:我想编写一个工作 python 类,只需给它一个随机值,它就可以自己转换所有内容。

我想要的是以下内容:

>>> first=Temperature()
>>> first.celsius = 60
>>> first.kelvin
333.15
>>> first.fahrenheit
140

无论我设置的第一个描述符是什么,我都希望其他人自己转换,即使我执行以下操作:

>>> first.celsius = 60
>>> first.kelvin
333.15
>>> first.celsius += 1
>>> first.kelvin
334.15

这是我一直在处理的代码:

class Celsius:
    def __get__(self, instance, owner):
        return 5 * (instance.fahrenheit - 32) / 9
    def __set__(self, instance, value):
        instance.fahrenheit = 32 + 9 * value / 5
    def __set__(self, instance, value):
        instance.kelvin = value + 273.15

class Temperature:
    celsius = Celsius()
    def __init__(self):
        self.fahrenheit = 0
    def __init__(self):
        self.kelvin = 0

有些事情正在工作,但转换回来的工作并不顺利,并且会出现一些错误,但我真的不知道如何使这项工作,即使你们给我一份 20 页的文档,我也会很感激一些帮助。

标签: pythonclasstemperature

解决方案


定义它,以便Temperature类跟踪一个单位的温度(我喜欢 Kelvin,所以我将使用它),然后在每个属性的 getter 和 setter 中使用它。

class Temperature:
    def __init__(self):
        self.__value = 0
    
    @property
    def celsius(self):
        return self.__value - 273.15

    @property
    def kelvin(self):
       return self.__value

    @property
    def fahrenheit(self):
        return (self.__value - 273.15) * 9 / 5 + 32

    @celsius.setter
    def celsius(self, val):
        self.__value = val + 273.15

    @kelvin.setter
    def kelvin(self, val):
        self.__value = val

    @fahrenheit.setter
    def fahrenheit(self, val):
        self.__value = ((val - 32) * 5 / 9) + 273.15

现在,您可以设置任何属性,当您获取其他属性时,您将获得正确的值

你可以像这样使用它:

t = Temperature()

t.celsius = 0
print(t.kelvin)
print(t.fahrenheit)

这输出:

273.15
32.0

你也可以这样做:

t.fahrenheit = 212
print(t.kelvin)
print(t.celsius)

输出:

373.15
100

中的双下划线self.__value使其成为“dunder 变量”,并在解释器中破坏其名称,因此您无法t.__value直接访问(您会收到AttributeError: 'Temperature' object has no attribute '__value'错误消息)


推荐阅读