2

我有一个类,它定义__str__以十六进制返回整数值,并__format__返回使用用户格式规范格式化的值:

class MyClass:
    def __init__(self, value: int):
        self._value = value

    def __str__(self):
        return '{:04X}'.format(self._value)

    def __format__(self, format_spec):
        return format_spec.format(self._value)

所以我希望:

'{:04X}'.format(MyClass(10)) == '000A'

 str(MyClass(10)) == '000A'

但该str.format调用仅返回格式规范,04X. 我究竟做错了什么?

4

1 回答 1

2

只有规范(冒号后的花括号中的部分)被传递给__format__方法,在你的情况下是'04X'. 它不包含占位符,因此调用format它只会'04X'再次返回。

如果您想“传递”format_spec到,self._value那么您需要明确地执行此操作,例如使用内置format函数:

class MyClass:
    def __init__(self, value: int):
        self._value = value

    def __str__(self):
        return '{:04X}'.format(self._value)

    def __format__(self, format_spec):
        return format(self._value, format_spec)
>>> '{:04X}'.format(MyClass(10))
'000A'
于 2019-12-10T16:06:47.257 回答