Обчислювані властивості
Давайте створимо клас у якому будемо зберігати значення температури, наприклад температури повітря. У різних країнах температуру повітря вимірюють по різних шкалах: в Україні — за Цельсієм, у, наприклад, США — за шкалою Фаренгейта. Спроектуємо наш клас таким чином, щоб з температурою можна було б працювати одразу у двох системах.
Перше що зробимо, це з'ясуємо як перевести температуру з градусів Цельсія у градуси Фаренгейта і навпаки:
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)
>>>