Я пытаюсь определить класс, интегрированный с несколькими видами выражения цветового пространства.
т.е.,
#'hsv', 'rgb'...such fields are different color space expression of one thing.
my_color = MyColor('#ffffff')
my_color.rgb #(1.0, 1.0, 1.0)
my_color.rgb24 #(255, 255, 255)
my_color.hsv #(0.0. 0.0, 1.0)
И я надеюсь, что для некоторых целей этот класс может поддерживать некоторые базовые математические операции,
my_color.hsv[2] -= 1.0
Конечно, все поля должны синхронизировать свое значение при изменении любого другого «связанного» поля.
#after operation above.
my_color.rgb #(0.0, 0.0, 0.0)
my_color.rgb24 #(0.0, 0.0, 0.0)
my_color.hsv #(0.0, 0.0, 0.0)
Какой лучший способ сделать это.
Я пробовал аннотации @property и @setter.
@property
def hsv(self):
return self._hsv
@hsv.setter
def hsv(self, val):
self._hsv = val
_sync_change() #update other fields by the new hsv value
Надеюсь, @setter поможет мне обновить другие поля на основе нового значения 'hsv'. Когда я выполняю операцию присваивания my_color.hsv, она работает.
my_color.hsv = (0.5, 0.5, 0.5)
print(my_color.rgb, my_color.rgb24) #shows correct value.
Однако, когда я беру модификацию не на кортеже, а на элементе кортежа, все становится не так.
my_color.hsv[2] -= 1.0
print(my_color.rgb, my_color.rgb24) #nothing changed.
print(my_color.hsv) #nothing changed.
Интересно, что происходит, когда я ошибся, и что я могу сделать с помощью @setter, или есть лучший и естественный способ сделать это.