我需要从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 !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
答案 0 :(得分:0)
啊我发现属性不需要在要添加的插槽中。现在我正在思考,我已经知道了,但由于某种原因习惯于定义插槽,我忘了它们不是强制性的。
class HexDisplayedInteger(int):
def __str__(self):
return format(self, "0%sX" % self.length)
答案 1 :(得分:0)
PyLongObject
是CPython实现中的可变长度类,它在其结构的末尾存储digits数组。 __slots__
在结构的末尾保留空间并使用偏移量来检索它们,这是为了避免使用字典(__dict__
)的开销。 总而言之,由于PyLongObject
及其派生词的长度是可变的,所以这两个冲突是不可能的,以固定的偏移量来保留/获取插槽。