我想在字典中存储对象的属性,以便稍后更改这些属性。问题是这些属性是布尔值,所以当我把它们放在字典中时,它会存储布尔值,而不是属性变量。
即
location_dict = {
'dorm_common':newnom.dorm_common,
'cafeteria':newnom.cafeteria,
'comp_room':newnom.comp_room}
我想遍历dict并更改newnom.comp_room = True。问题是字典存储了newnom.comp_room的默认值,即None,所以我无法设置newnom.comp_room。
我可以想办法解决这个问题,例如制作newnom.comp_room“newnom.comp_room”并使用exec(v +'True'),或者进入
(newnom.__dict__()[k] = True)
但我想知道是否有另一种方法可以在python字典中覆盖这个默认行为。
答案 0 :(得分:2)
这对词典来说并不特别。它是整个Python编程语言的固有特性。你想要传递引用或可变布尔(并且无论如何你应该检查你对Python的语义及其实现的理解,你听起来可能会让一些东西混淆),但是Python不支持这一点。而且你无法改变它,如果可以的话,你将面临几种可能的蠕虫病毒。
改变你的设计(按照不断增加的顺序)......
getattr
/ setattr
,或使用专门的方法进行验证以限制动态蠕变和事故 - 甚至可能newnom
)。我真的推荐这个。这是迄今为止最简单,最不令人惊讶的方法。(newnom, 'dorm_common')
)。location_dict
实际上不是一个字典,而是支持某些字典操作的对象,并将它们路由到newnom
的操作。 (如果你有大量需要外部字典的遗留代码,我只会推荐这样的hackery。)答案 1 :(得分:0)
您可以尝试使用包含要修改的值的代理对象:
class MutableProxy(object):
__slots__ = "value"
def __init__(self, value):
self.value = value
def get(self):
return self.value
def set(self, value):
self.value = value
然后,您可以使用get()
和set()
函数设置实际值,例如:
>>> var_1 = MutableProxy(100)
>>> var_1.get()
100
>>> d = { "var_1" : var_1 }
>>> d["var_1"].set(600)
>>> var_1.get()
600
这样做的主要缺点是代理对象将占用比原始对象更多的内存,但这可能是一个适当的权衡。