Перейти до змісту

Обчислювані властивості

Давайте створимо клас у якому будемо зберігати значення температури, наприклад температури повітря. У різних країнах температуру повітря вимірюють по різних шкалах: в Україні — за Цельсієм, у, наприклад, США — за шкалою Фаренгейта. Спроектуємо наш клас таким чином, щоб з температурою можна було б працювати одразу у двох системах.

Перше що зробимо, це з'ясуємо як перевести температуру з градусів Цельсія у градуси Фаренгейта і навпаки:

f = c *  9/5 + 32
c = (f -32)* 5/9

Спроектуємо наш клас наступним чином:

  • температуру будемо зберігати у градусах цельсія у властивості c
  • якщо нам треба дізнатись температуру по Фаренгейту, ми звертатимемось до властивості f. Гетер автоматично переводитиме значення у градуси Фаренгейта використовуючи значення атрибута c
  • сеттер властивості f буде встановлювати значення властивості c
  • у конструкторі передбачимо спосіб вказати у якій шкалі ми задаємо температуру

Клас спроектовано, залишається, як завжди, записати це мовою Python:

>>> class T:
...     CELSIUS = 1
...     FAHRENHEIT = 2
...     def __init__(self, t, scale=CELSIUS):
...             if scale == T.CELSIUS:
...                     self.c = t
...             else:
...                     self.f = t
...     @property
...     def f(self):
...             return (self.c * 9/5) + 32
...     @f.setter
...     def f(self, f):
...             self.c = (5/9) * (f - 32)
...     def __str__(self):
...             return str(self.c) + 'C'
...     def __repr__(self):
...             return f"T({self.c}C)"
...
>>> t1 = T(32, T.FAHRENHEIT)
>>> t1
T(0.0C)
>>> t1.f
32.0
>>> t1.c
0.0
>>> t2 = T(0)
>>> t2.f
32.0
>>> t2.c
0
>>> t2
T(0C)
>>>
Back to top