python - 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 页的文档,我也会很感激一些帮助。
解决方案
定义它,以便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'
错误消息)
推荐阅读
- python-3.x - 如何使用 for-in 语法在 for 循环中进行两次迭代
- python - 使用 Resnet 的图像生成器
- c - 如何使用 yacc 从 char 数组中解析?
- wordpress - 在 NGINX 上的 Laravel 应用程序中的子文件夹上运行 Wordpress
- java - 如何在 Android 中多次播放可绘制动画?
- bash - Bash:通过分组命令和布尔运算符没有 IF 的条件语句
- sql-server - SQL Server 中日期的默认格式是什么?
- javascript - Javascript 减少对象
- android - 使用 React Native 从 url 共享文件
- python - 当 basic_consume 时 BlockingConnection._flush_output