簡體   English   中英

Python 溫度 class 轉換器 (K,F,C)

[英]Python Temperature class converter (K,F,C)

這是我正在嘗試做的事情:我想編寫一個工作 python class 只需給它一個隨機值就可以自己轉換所有內容。

我想要的是以下內容:

>>> 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 頁的文檔,我也將不勝感激。

定義它,以便Temperature class 跟蹤一個單位的溫度(我喜歡 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'錯誤)

我認為將屬性直接放在 class 中會更容易。

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)

Output:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM