如何使属性不在__dict__中?
我正在创建一系列对象实例,想要保存和加载它们的属性,使用的是它们的 __dict__
属性。因为我不想保存或加载某些属性,所以我想把这些属性放在 __dict__
之外。
具体来说:
我创建了一个父对象,它只是用来保存一组子对象。子对象的 __dict__
会被保存到文件中,之后再加载回来以重新实例化它们。我希望子对象能引用父对象,但我不想把这个引用保存到文件中,也不想从文件中加载,因为这样做没有意义。
有没有什么语法可以让某个属性不出现在 __dict__
中呢?
附注:很多回答建议使用 pickle,但我现在使用 json 来保持数据可读性。
4 个回答
1
你可以通过重写 __getattr__
和 __setattr__
这两个方法,来让你的对象的属性不出现在 __dict__
里。但是,你需要把这些额外的属性存放在其他地方。而且,这样做会让人很难搞清楚你的对象到底有哪些成员。所以,这其实更像是一种小技巧,而不是一个好的解决方案。
1
如果你在使用 Python 的 pickle 模块,你可以创建两个方法 __getstate__
和 __setstate__
,这样你就可以自定义哪些属性会被保存(也就是“腌制”)了,具体可以这样做:
class Coordinate(object):
def __init__(self, x, y, z=0):
self.x, self.y, self.z = x, y, z
def __getstate__(self):
"""By default if no __getstate__ was defined __dict__ will be pickle, but in
this case i don't want to pickle self.z attribute because of that this
method return a dict in the form {'x': ..., 'y': ...}.
"""
return {
"x": self.x,
"y": self.y,
}
def __setstate__(self, data):
self.__init__(data["x"], data["y"])
3
给你不想保存的属性加个前缀,这样在保存的时候就可以把它们排除掉。