Python:一个对象是否可能将自身更改为其他对象?
后来我需要将对象更改为它的值,我只能像这样迭代字典,可能是递归的:Python:一个对象是否可能将自身更改为其他对象?,python,pointers,reference,Python,Pointers,Reference,后来我需要将对象更改为它的值,我只能像这样迭代字典,可能是递归的: class Myclass(object): def get_val(self): return 100 my_obj = MyClass() data = { 'key_1': my_obj, ... # other fields } 但有没有可能通过我的obj本身做到这一点 我不这么认为,因为在python中,您无法像在c中那样操作指针,但有没有更好的方法?对象不能用其他对象替换
class Myclass(object):
def get_val(self):
return 100
my_obj = MyClass()
data = {
'key_1': my_obj,
... # other fields
}
但有没有可能通过我的obj本身做到这一点
我不这么认为,因为在python中,您无法像在c中那样操作指针,但有没有更好的方法?对象不能用其他对象替换自身的任何/所有引用。句号 但是,如果需要指针对象的字典(使用某种形式的
.get()
方法返回实际数据),则只需重写dict
子类的\uuuu getitem\uuuu
方法,即可在从字典检索数据时添加适当的逻辑:
for key in data:
if type(data[key]) is MyClass:
data[key] = data[key].get_val()
尽管请注意,这只改变了一种查找方法,即使用.items()
或.get()
等将不会使用修改后的\uuuu getitem\uuuuu
,因此可以使用集合完成更完整的实现。可变映射
:
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
然后,所有其他方法,如
.get
和.pop
和.items
等,都是根据此处定义的方法创建的。原始指针对象仍然可以通过数据访问。原始dict[“key\u 1”]
因此没有隐藏/丢失任何信息。对象本身无法做到这一点,尽管dictionary的子类可以相当容易地覆盖它处理数据[key]
查找的方式。如前所述,你可以在你的类中重写多种神奇的方法来返回一个特定的值为什么你首先要这么做?
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)