2011-10-27 16 views
24

Por ejemplo:¿Puedo sobrescribir la forma de cadena de una ruta de acceso nombrada?

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

Lo que quiero es:

>>> str(s) 
90 

Eso es que quiero la representación de cadena para mostrar el atributo de sonoridad. ¿Esto es posible?

+1

Tal vez debería crear una clase reutilizable adecuada en su lugar. – Oliver

Respuesta

42

Sí, no es difícil de hacer y hay un ejemplo para él en el namedtuple docs .

La técnica consiste en hacer una subclase que añade su propio método 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' 
+9

¿Qué es el uso de '__slots__' aquí? ¿Es requerido u opcional? – clwen

+14

Establecer '' __slots__'' en una tupla vacía es una técnica para guardar la memoria. Se asegura de que las instancias de '' Spoken'' tomen la misma cantidad de memoria que una tupla normal. Sin la entrada de tragamonedas, cada instancia requiere su propio diccionario (que es mucho más grande que una tupla). –

9

se puede definir una función para la que:

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

y la asigna a __str__:

Spoken.__str__ = print_loudness 
+1

por curiosidad, ¿devolverá esto un 'entero 'o una' cadena ', ya que su' 'str' sobrecargado está devolviendo un' int'? – Serdalis

+1

@Serdalis: bien manchado, esto devolverá incorrectamente un 'entero '. Arreglando ahora. –

+0

Me gusta de esta manera, ya que agrega poco texto a la forma predeterminada de usar '' namedtuple''. Incluso podrías acortarlo usando una expresión lambda sin perder mucha legibilidad (en mi humilde opinión): '' Spoken .__ str__ = lambda x: str (x.loudness) ''. (Por supuesto, puede usar [''% '' o '' str.format (...) ''] (http://stackoverflow.com/q/5082452) dentro de la expresión lambda). – djlauk

4

puede utilizar código como este:

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)) 

Esto envolverá namedtuple en una clase de su elección a la cual luego sobrecarga la función str también.

Cuestiones relacionadas