微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Python 温度等级转换器K、F、C

如何解决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,value):
        instance.fahrenheit = 32 + 9 * value / 5
    def __set__(self,value):
        instance.kelvin = value + 273.15

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

有些东西正在工作,但转换回来的效果不佳,并且会出现一些错误,但我真的不知道如何进行这项工作,希望得到一些帮助,即使你们给我一份 20 页的文档。

解决方法

定义它以便 Temperature 类以 一个 单位跟踪温度(我喜欢开尔文,所以我将使用它),然后在 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 变量”,而 mangles its name 位于解释器内部,因此您无法直接访问 t.__value(您会得到一个 { {1}} 个错误)

,

我认为将属性直接放在该类中会更容易。

class Temp:
    _f = None
    _c = None
    _k = None
    @property
    def f(self):
        return self._f
    @property
    def c(self):
        return self._c
    @property
    def k(self):
        return self._k

    #Update "assignment to c" to perform additional calculations. 
    @c.setter
    def c(self,temp):
        self._c = temp 
        self._f = 1.8 * temp + 32
    
t   = Temp()
t.c = 34
print(t.f)
,

您需要的是属性。使用一个通用的内部值并根据属性集进行设置:

class Temperature:
    def __init__(self):
        self.__kelvin = 273.15

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

    @property
    def celsius(self):
        return self.__kelvin - 273.15

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

    @kelvin.setter
    def kelvin(self,value):
        self.__kelvin = value

    @celsius.setter
    def celsius(self,value):
        self.__kelvin = value + 273.15

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

    def __repr__(self):
        return f'Temperature(__kelvin={self.__kelvin})'

    def __str__(self):
        return f'{self.kelvin:.2f}\N{DEGREE SIGN}K/{self.celsius:.2f}\N{DEGREE SIGN}C/{self.fahrenheit:.2f}\N{DEGREE SIGN}F'

first = Temperature()
print(first)
first.kelvin = 0
print(first)
first.fahrenheit = 212
print(first)
first.celsius = 10
print(first)

输出:

273.15°K/0.00°C/32.00°F
0.00°K/-273.15°C/-459.67°F
373.15°K/100.00°C/212.00°F
283.15°K/10.00°C/50.00°F
,

除了我标记为答案的代码之外的另一个代码也执行完全相同的工作:

class Temperature:
    def __init__(self):
        self.kelvin = 0
    @property
    def celsius(self):
        return self.kelvin - 273.15
    @celsius.setter
    def celsius(self,val):
        self.kelvin = val + 273.15
    @property
    def fahrenheit(self):
        return self.kelvin * 9/5 - 459.67
    @fahrenheit.setter
    def fahrenheit(self,val):
        self.kelvin = (val + 459.67) * 5/9

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。