如何使属性不在__dict__中?

5 投票
4 回答
3572 浏览
提问于 2025-04-16 19:27

我正在创建一系列对象实例,想要保存和加载它们的属性,使用的是它们的 __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

给你不想保存的属性加个前缀,这样在保存的时候就可以把它们排除掉。

撰写回答