我可以覆盖一个namedtuple的字符串形式吗?

can*_*dry 37 python

例如:

>>> Spoken = namedtuple("Spoken", ["loudness", "pitch"])
>>> s = Spoken(loudness=90, pitch='high')
>>> str(s)
"Spoken(loudness=90, pitch='high')"
Run Code Online (Sandbox Code Playgroud)

我想要的是:

>>> str(s)
90
Run Code Online (Sandbox Code Playgroud)

那就是我希望字符串表示显示响度属性.这可能吗 ?

Ray*_*ger 63

是的,这并不难做,并且在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'
Run Code Online (Sandbox Code Playgroud)

  • 将``__slots__``设置为空元组是一种节省内存的技术.它确保``Spoken``的实例占用与常规元组相同的内存量.没有slot条目,每个实例都需要自己的字典(比元组大得多). (22认同)
  • 这里有什么`__slots__`用法?它是必需的还是可选的? (14认同)
  • 除了节省内存之外,值得注意的是 Python 版本高达 3.5.0 [define](https://github.com/python/cpython/blob/v3.5.0/Lib/collections/__init__.py#L324) a ` __dict__` 属性。因此,是否设置控制“__dict__”属性定义的“__slots__”决定会影响与该“__dict__”属性交互的函数的行为;例如,如果未设置“__slots__”,则“vars(s)”返回“{}”而不是“OrderedDict([('loudness', 90), ('pitch', 'high')])`。这在 Python 3.5.1 中发生了变化,如[此处](/sf/ask/2391652861/)所述。 (2认同)

Bjö*_*lex 12

您可以为它定义一个函数:

def print_loudness(self):
    return str(self.loudness)
Run Code Online (Sandbox Code Playgroud)

并将其分配给__str__:

Spoken.__str__ = print_loudness
Run Code Online (Sandbox Code Playgroud)

  • @Serdalis:发现得很好,这会错误地返回一个“整数”。立即修复。 (2认同)
  • 我喜欢这种方式,因为它为使用“namedtuple”的默认方式添加了很少的文本。您甚至可以使用 lambda 表达式来缩短它,而不会损失太多可读性(恕我直言):``Spoken.__str__ = lambda x: str(x.loudness)``。(当然,您可以在 lambda 表达式中使用 [``%`` 或 ``str.format(...)``](http://stackoverflow.com/q/5082452))。 (2认同)