__Str __ () uitbreiden in plaats van het vervangen

Ik wil de methode __ str __() van mijn object uitbreiden. De str (obj) leest momenteel:


Ik vind het adres leuk als een unieke ID, maar ik wil een aantal kenmerken toevoegen. Wat is de beste manier om dit uit te breiden terwijl je toch het adresgedeelte behoudt? Ik zou er ongeveer zo willen uitzien:


Ik zie geen attribuut dat het adres opslaat. Ik gebruik Python 2.4.3.

Edit: Would be nice to know how to do this with __repr__()

Solution (for python 2.4.3):

def __repr__(self):
    return "
1
Gebruik om te beginnen geen dergelijke verouderde python-versie. Behalve dat, voor wat je probeert te doen is er __ repr __ .
toegevoegd de auteur ThiefMaster, de bron

2 antwoord

U kunt het adres krijgen met id (obj) . Waarschijnlijk wilt u de methode __ repr __() wijzigen in plaats van __ str __() . Hier is de code die dit in Python 2.6+ doet:

class Test(object):
    def __repr__(self):
        repr_template = ("<{0.__class__.__module__}.{0.__class__.__name__}"
                         " object at {1}: name={0.name}, isValid={0.isValid}>")

        return repr_template.format(self, hex(id(self)))

Test met:

test = Test()
test.name = "foo"
test.isValid = True
print repr(test)
print str(test)
print test

U kunt eenvoudig hetzelfde soort dingen doen in een oudere versie van Python door string-opmaakbewerkingen zoals "% s" te gebruiken in plaats van de syntaxis van de clearer str.format() . Als u str.format() gaat gebruiken, kunt u ook de ingebouwde hex-opmaakfunctie gebruiken door {1: #x} in de sjabloon te gebruiken en te wijzigen argument 1 van hex (id (zelf)) naar gewoon id (zelf) .

5
toegevoegd
Bewerkt om een ​​volledig antwoord te hebben.
toegevoegd de auteur Michael Hoffman, de bron
Hoe zit het met de rest? Ik zie dat obj .__ class __.__ name__ Test retourneert, maar hoe zit het met de modulenaam?
toegevoegd de auteur shadowland, de bron
Dat deed het. Ik moest gewoon de% s gebruiken zoals je had voorgesteld.
toegevoegd de auteur shadowland, de bron
class Mine(object):
    def __str__(self):
        return object.__str__(self) + " own attributes..."
1
toegevoegd
Dit levert niet de uitvoer op die hij wenst. Hij wil dat het allemaal in de hoek tussen haakjes staat in zijn voorbeeld. Dit geeft het origineel terug dat in zijn eigen set haaks-haakjes staat en zijn attributen "buiten" van hen toevoegt.
toegevoegd de auteur Brandon Buck, de bron