【发布时间】:2020-04-06 06:32:14
【问题描述】:
我有一个班级Color,如下图。我的问题是:初始化该类的实例后,某些键值的更改不再影响其他键值(请参见下面的示例)。
我怎样才能实现这种行为?
class Color(dict):
def __init__(self, **args):
try:
self['name'] = args['name']
except:
self['name'] = 'unnamed_color'
try:
h = args['hex'].replace('#', '')
rgb = tuple(int(h[i:i+2], 16) for i in (0, 2, 4))
self['r'] = rgb[0]
self['g'] = rgb[1]
self['b'] = rgb[2]
self['a'] = 1
except:
try:
self['r'] = min(max(int(args['r']), 0), 255)
except:
self['r'] = 0
try:
self['g'] = min(max(int(args['g']), 0), 255)
except:
self['g'] = 0
try:
self['b'] = min(max(int(args['b']), 0), 255)
except:
self['b'] = 0
try:
self['a'] = min(max(int(args['a']), 0), 1)
except:
self['a'] = 0
self['rgba'] = (self['r'],self['g'],self['b'],self['a'])
self['rgb'] = (self['r'],self['g'],self['b'])
self['hex'] = '#%02x%02x%02x' % self['rgb']
def __getattr__(self, item):
return self[item]
def __str__(self):
return self['name']
示例:
purple = Color(hex='#00ff00')
print(purple.rgba) # returns (0, 255, 0, 1)
purple.r = 24
print(purple.rgb) # still returns (0, 255, 0) but (12, 255, 0) expected
【问题讨论】:
-
你真的不应该来自
dict..! -
我为什么不应该呢?还有什么更好的方法?
-
@maxischl 很好的一个原因 - 因为
Color不是dict。你为什么要开始?这比class Color:有什么优势? -
因为它出现了。我很高兴有更好的解决方案。无论如何,我经常使用 Class(dict),而颜色版本只是整个问题的一种形式;)
标签: python class dictionary