Python:对象是否有可能将自己更改为其他内容?

时间:2016-07-26 07:33:28

标签: python pointers reference

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中那样操纵指针,但还有更好的方法吗?

1 个答案:

答案 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访问,因此没有任何隐藏/丢失的跟踪。