为了账号安全,请及时绑定邮箱和手机立即绑定

Python:当有 __slots__ 时如何编写 __repr__

Python:当有 __slots__ 时如何编写 __repr__

慕雪6442864 2023-07-18 16:37:22
我想知道如何__repr__使用__slots__. 据我了解__repr__,它应该返回一个字符串,该字符串可用于构造我们调用的对象__repr__。换句话说,给予repr(object)Python 解释器应该构造object.但是,如果有一个类具有__slots__,我很难想象如何实现它。这是因为在使用 时__slots__,槽中的某些属性可能会被初始化并具有值,而其他属性可能不会。那么我如何找出哪些属性已初始化以及将它们传递给字符串的值__repr__?此类的最小示例:class TestClass:    __slots__ = 'one', 'two', 'three', 'four', 'five', 'six', 'seven', 'eight', 'nine', 'ten', '__dict__'    def __init__(self, something, something_else, **kwargs):        self.something = something        self.something_else = something_else        for key, value in kwargs.items():            setattr(self, key, value)    def __repr__(self):        return '%s(%r, %r)' %(self.__class__.__name__, self.something, self.something_else)有什么建议么?
查看完整描述

1 回答

?
慕丝7291255

TA贡献1859条经验 获得超6个赞

据我了解__repr__,它应该返回一个字符串,该字符串可用于构造我们调用的对象__repr__。换句话说,给予repr(object)Python 解释器应该构造对象。

这只是一个建议,而不是强加:

如果可能的话,这应该看起来像一个有效的 Python 表达式,可用于重新创建具有相同值的对象(给定适当的环境)。如果这是不可能的,则应返回 <...一些有用的描述...> 形式的字符串。

并且“如果可能”的解释非常松散和弱,许多对象根本不会打扰,例如类或函数的 repr可以产生其源表示,但不要这样做,因为它几乎没有用例并且这会比有用更烦人。

但是,如果有一个类具有__slots__,我很难想象如何实现它。这是因为在使用 时__slots__,槽中的某些属性可能会被初始化并具有值,而其他属性可能不会。

当然不是。我从来没有写过一个有空位的类,但并不是所有的空位一直都被填满。Plus hasattr/getattr与插槽配合得很好。

但我不得不问:你是货物崇拜者吗__slots__?是否有人曾经告诉您使用插槽,而现在您却到处使用它们?

slot 是一种内存优化工具,要点是每个成员只需要一个指针(+一些对象开销),而不是 dict 实例的开销(及其摊销重新分配)。当您通常不填充插槽时,使用插槽几乎没有任何意义,添加__dict__到插槽中更没有意义。

更不用说最近的 Python 3 迭代已经为实例字典添加了各种优化,使得槽的用处变得更少,至少随着属性数量的增加(在 3.6 的相当大的类上,我们发现差异不到 5%,尽管在小类上它是可能仍然很重要)。


查看完整回答
反对 回复 2023-07-18
  • 1 回答
  • 0 关注
  • 83 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信