【发布时间】:2019-04-26 17:42:06
【问题描述】:
我正在尝试定义一个集成了多种色彩空间表达的类。
即,
#'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 方式做什么,或者有没有更好更自然的方式。
【问题讨论】:
-
my_color.hsv[2] -= 1.0不会在没有真正讨厌的、不值得的、错误滋生的自定义序列类型的情况下进行同步。
标签: python class class-design color-conversion