【发布时间】:2013-12-31 21:31:58
【问题描述】:
我正在使用 dict 对象来保存类中的实例值。我喜欢使用 dict,因为我经常想同时设置或获取一堆值,并且很容易传递列表或 dict 来完成此操作。例如,要获取几个实例值,我可以传递一个 [键列表] 并返回一个 {dict of those keys: values}。据我所知,如果可能的话,为每个键使用单独的属性需要跳过很多代码圈。
无论如何,我正在寻找这样的东西:
class SomeClass(object):
def __init__(self):
self._desc = {
'hair': 'brown'
'eyes': 'blue'
'height': 1.55
}
到目前为止,这一切都非常简单,但有些值需要特殊的“设置”条件。我的第一次尝试是这样的:
class SomeClass(object):
def __init__(self):
self._haircolor = 'blonde'
self._eyecolor = 'green'
self._desc = {
'haircolor': self.haircolor
'eyecolor': self.eyecolor
'height': 1.55
}
@property
self.haircolor(self):
return self._haircolor
@haircolor.setter
self.haircolor(self, color):
if color.lower() in ['blonde', 'brunette', 'brown', 'black', 'auburn', 'red']:
self._haircolor = color
else: raise ValueError()
# Same type of property construct for eyecolor
这不起作用。 self._desc['haircolor'] 将初始化为 blonde,但它与属性构造或 self._haircolor 属性没有动态联系。我尝试将其替换为
class SomeClass(object):
def __init__(self):
self._haircolor = 'blonde'
self._eyecolor = 'green'
self._desc = {
'haircolor': property(self.get_haircolor, self.set_haircolor)
'eyecolor': property(self.get_eyecolor, self.set_eyecolor)
'height': 1.55
}
self.get_haircolor(self):
return self._haircolor
self.set_haircolor(self, color):
if color.lower() in ['blonde', 'brunette', 'brown', 'black', 'auburn', 'red']:
self._haircolor = color
else: raise ValueError()
但这以不同的方式失败了。
print self._desc['haircolor']
将为属性对象返回一个 str,并且
self._desc['haircolor'] = 'brunette'
销毁属性对象并用字符串替换它。
我研究了一些类似的问题,例如this one 和this one。
然而,这两种情况都在字典级别运行。问题在于,当我定义自定义 dict 类时,我需要对 dict 有很多了解,因为我需要预测键名并在 setitem (第一个示例)或 dict 级别中切换它们属性对象(第二个示例)。理想情况下,我想将 setter 与值对象本身关联起来,这样 dict 就不需要知道键可以引用的值有什么特别之处。
【问题讨论】:
-
看看norman。它应该做你想做的,并允许字段级验证。
标签: python dictionary properties setter