如何使用__slots__从int / str派生?

时间:2018-02-10 20:13:34

标签: python string-formatting pretty-print slots

我需要从int / str派生一个执行漂亮打印的类,但是必须对打印进行参数化,因此需要一个插槽。这符合Python限制,即从int / str派生的类不能具有非空插槽。有人可以提出解决方法吗?

class HexDisplayedInteger(int):
    __slots__ = ["length"]

    def __str__(self):
        return format(self, "0%sX" % self.length)

这会产生错误:

_______________________________ ERROR collecting tests/lib/test_search.py _______________________________
tests/lib/test_search.py:1: in <module>
    from declarativeunittest import *
tests/declarativeunittest.py:5: in <module>
    from construct import *
construct/__init__.py:22: in <module>
    from construct.core import *
construct/core.py:2905: in <module>
    class HexDisplayedInteger(integertypes[0], object):
E   TypeError: Error when calling the metaclass bases
E       nonempty __slots__ not supported for subtype of 'long'
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! Interrupted: 13 errors during collection !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

2 个答案:

答案 0 :(得分:0)

啊我发现属性不需要在要添加的插槽中。现在我正在思考,我已经知道了,但由于某种原因习惯于定义插槽,我忘了它们不是强制性的。

class HexDisplayedInteger(int):
    def __str__(self):
        return format(self, "0%sX" % self.length)

答案 1 :(得分:0)

  1. PyLongObject是CPython实现中的可变长度类,它在其结构的末尾存储digits数组。
  2. __slots__在结构的末尾保留空间并使用偏移量来检索它们,这是为了避免使用字典(__dict__)的开销。

总而言之,由于PyLongObject及其派生词的长度是可变的,所以这两个冲突是不可能的,以固定的偏移量来保留/获取插槽。