我可以覆盖命名元组的字符串形式吗?
举个例子:
>>> 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)