如何在Python中使用__slots__转储对象的所有字段

时间:2019-06-13 17:18:13

标签: python

我有一个带有两个字段的对象,我希望能够while作为str来使用。我使用下面的代码来做到这一点。

dict

现在,我要对此进行优化,并包含class Foo: def __init__(self, a, b): self.a = a self.b = b def __str__(self): return str(self.__dict__) >>> str(Foo(1, 2)) "{'a': 1, 'b': 2}" 。添加__slots__会删除__slots__

在同时使用__dict__

的情况下,如何获得与上述相同的结果
__slots__

2 个答案:

答案 0 :(得分:1)

您可以执行以下操作:

class Foo:
    __slots__ = ('a', 'b')

    def __init__(self, a, b):
        self.a = a
        self.b = b

    def __str__(self):
        return str({slot: getattr(self, slot) for slot in self.__slots__})

x = Foo(1,2)

str(x)
"{'a': 1, 'b': 2}"

不是最漂亮的,但是由于__slots__将删除dict属性以节省内存,因此您可以通过获取每个属性来手动构建字典

答案 1 :(得分:0)

在接受的答案之上,您可以将__dict__重新定义为属性。

class Foo:
    __slots__ = ('a', 'b')
    def __init__(self, a, b):
        self.a = a
        self.b = b

    @property
    def __dict__(self):
        return {slot: getattr(self, slot) for slot in self.__slots__}

    def __str__(self):
        return str(self.__dict__)

x = Foo(1,2)

str(x)
"{'a': 1, 'b': 2}"