我可以覆盖命名元组的字符串形式吗?

47 投票
3 回答
15171 浏览
提问于 2025-04-17 05:05

举个例子:

>>> Spoken = namedtuple("Spoken", ["loudness", "pitch"])
>>> s = Spoken(loudness=90, pitch='high')
>>> str(s)
"Spoken(loudness=90, pitch='high')"

我想要的是:

>>> str(s)
90

也就是说,我希望字符串的表现形式能显示出响度这个属性。这样做可以吗?

3 个回答

4

你可以使用这样的代码:

from collections import namedtuple

class SpokenTuple( namedtuple("Spoken", ["loudness", "pitch"]) ):

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

s = SpokenTuple(loudness=90, pitch='high')

print(str(s))

这段代码会把一个叫做namedtuple的东西放进你选择的一个类里,然后你可以重写这个类的str函数。

20

你可以为这个事情定义一个函数:

def print_loudness(self):
    return str(self.loudness)

然后把这个函数指定给 __str__

Spoken.__str__ = print_loudness
82

没错,这个操作并不难,namedtuple文档里有个例子可以参考。

这个方法是创建一个子类,并在里面添加自己的str方法:

>>> from collections import namedtuple
>>> class Spoken(namedtuple("Spoken", ["loudness", "pitch"])):
        __slots__ = ()
        def __str__(self):
            return str(self.loudness)

>>> s = Spoken(loudness=90, pitch='high')
>>> str(s)
'90'

更新:

你也可以使用 typing.NamedTuple 来达到同样的效果。

from typing import NamedTuple

class Spoken(NamedTuple):
    
    loudness: int
    pitch: str
    
    def __str__(self):
        return str(self.loudness)

撰写回答