需求
- 实现华氏度和摄氏度的转换
摄氏度 = 5 *(华氏度-32) / 9
华氏度 = 9 * 摄氏度 / 5+32
开氏度 = 摄氏度 + 273.15
主要封装算法思路
- 设置私有属性,私有属性摄氏度、华氏度和开氏度
- 用户不管给那个属性,统一转换为摄氏度
- 通过属性装饰器property,控制想要的温度,需要什么温度转换什么温度,不需要时不求值,实现一定意义上的惰性求值。
实现代码
class Temperature:
"""on doc"""
def __init__(self,t,unit="c"):
self._c = None
self._f = None
self._k = None
if unit == "f":
self._f = t
self._c = self.f2c(t)
elif unit == "k":
self._k = t
self._c = self.k2c(t)
else:
self.c = t
@property
def c(self):
return self._c
@property
def f(self):
if self._f is None:
self._f = self.c2f(self._c)
return self._f
@property
def k(self):
if self._k is None:
self._k = self.c2k(self._c)
return self._k
@classmethod
def c2f(cls,c):
return 9*c/5 + 32
@classmethod
def f2c(cls,f):
return 5*(f-32)/9
@classmethod
def c2k(cls,c):
return c + 273.15
@classmethod
def f2k(cls,f):
return cls.c2k(cls.f2c(f))
@classmethod
def k2f(cls,k):
return cls.c2f(cls.k2c(k))
@classmethod
def k2c(cls,k):
return k-273.15
t = Temperature(45,"f")
print(t.c,t.f,t.k)
运行结果:
7.222222222222222 45 280.3722222222222