class Myclass(object):
def get_val(self):
return 100
my_obj = MyClass()
data = {
'key_1': my_obj,
... # other fields
}
后来我需要将对象更改为它的值,我只能像这样迭代字典,可能是递归的:
for key in data:
if type(data[key]) is MyClass:
data[key] = data[key].get_val()
但是可以通过my_obj本身来做到这一点吗?
我不这么认为,因为在python中你不能像c中那样操纵指针,但还有更好的方法吗?
答案 0 :(得分:0)
对象不能用其他东西替换自己的任何/所有引用。周期。
但是,如果您需要一个指针对象的字典(使用某种形式的.get()
方法来返回实际数据),那么只需覆盖__getitem__
子类的dict
方法让您在从字典中检索数据时添加适当的逻辑:
class MyDict(dict):
def __getitem__(self,item):
value = dict.__getitem__(self,item) #may raise error
if isinstance(value, Myclass):
return value.get_val()
else:
return value
my_obj = Myclass()
data = MyDict({
'key_1': my_obj,
# other fields
})
assert data["key_1"] == 100
虽然请注意,这只会更改一种查找方法,但使用.items()
或.get()
等不会使用修改后的__getitem__
,因此可以使用{{{}进行更完整的实现1}}:
collections.MutableMapping
然后,import collections
class MyDict(collections.MutableMapping):
__slots__ = ["raw_dict"]
def __init__(self,*args,**kw):
self.raw_dict = dict(*args,**kw)
def __getitem__(self,item):
value = self.raw_dict[item]
if isinstance(value, Myclass):
return value.get_val()
return value
def __setitem__(self,item, value):
self.raw_dict[item] = value
def __delitem__(self, item):
del self.raw_dict[item]
def __len__(self):
return len(self.raw_dict)
def __iter__(self):
return iter(self.raw_dict)
和.get
以及.pop
等所有其他方法都是根据此处定义的方法创建的。并且原始指针对象仍然可以通过.items
访问,因此没有任何隐藏/丢失的跟踪。