class test(object):
def __init__(self):
self.a = 5
self.d = {'alfa': self.a}
我实例化该类的一个对象,并为其分配一个新值:
a_test = test()
a_test.a = 7
为什么a_test.d['alfa']
保持 5 而不是变为 7?
class test(object):
def __init__(self):
self.a = 5
self.d = {'alfa': self.a}
我实例化该类的一个对象,并为其分配一个新值:
a_test = test()
a_test.a = 7
为什么a_test.d['alfa']
保持 5 而不是变为 7?
因为self.a
包含5
在字典中分配它时的值。整数是不可变的,因此不进行引用。请阅读 Python 的数据模型。
在调用构造函数时创建字典。因此字典中的值是在构造过程中设置的——它们不是通过引用传递,而是通过值传递。
字典中的值指向传入的对象的值,而不是对象本身。所以简单地self.a
作为一个值不会自动更新字典,除非self.a
是可变的(例如一个列表)。
让我提议我的DictObj
课程,我一直在使用它来解决以下问题:
class DictObj(dict):
"""
a dictionary like class that allows attribute-like access to its keys
d = DictObj(a=2, b=7)
d['a'] --> 2
d.a --> 2
"""
def __getattr__(self, name):
return self.__getitem__(name)
def __setattr__(self, name, value):
if name in self:
self.__setitem__(name, value)
else:
super(DictObj, self).__setattr__(name, value)
def __add__(self, other):
res = DictObj(self)
res.update(other)
return res
项目存储在字典中,但也可以作为对象的属性访问。
您可以使用更多魔术方法轻松扩展它以满足您的需求。
>>> a = 5
>>> b = {"key":a}
>>> b
{'key': 5}
>>> a = 7
>>> b
{'key': 5}
>>>
你可以在这里看到,在“a”的分配实例值传递给字典“b”,它是 5。
所以 b['key'] 的值为 5 而不是 a 的引用。因此,无论您是否更改参考值时的值。
您应该添加一个 setter 来管理您的类实例:
def set_a(self, new_val):
self.a = new_val
self.d = {'alfa': self.a}