keppla hat geschrieben:
Ich hatte das so aus der Beschreibung rausgelesen (welches objekt an einen namen gebunden ist).
Das macht man aber nicht mit id sonder mit repr. Identität != Typ.
``id`` gibt mir einen kollisionsfreihen (Also wirklich einzigartige) Numerischen Wert zurück. Das ist die Identität des Objektes (BZW. Des namen der an Objekt X gebundene ist.).
Code: Alles auswählen
blex = BasisLexer("**//test**")
print id(blex) #id: 10374384
Falls zwei Objekte die gleiche id haben, muss das eine, eine Referenz auf das andere sein
oder auf ein Objekt X das noch
nicht untersucht wurde.
Was ist ``blex2``? Ist es das das instanziierte Objekt der Klasse ``BasisLexer`` oder ist es nur die Referenz auf ``blex``?
Code: Alles auswählen
ref_blex = blex2
print id(blex2) #id: 10374384
print id(ref_blex) #id: 10374384
# ref_blex == blex2
Tja, was sagte ich noch am Anfang? ``id`` gibt die Identität zurück? Das habe ich ja wohl ad absurdum geführt
Eine Identität ist was einzigartiges, einmaliges. Das gilt für Objekte/Name in Python aber anscheinend nicht. Mal ernsthaft: Alles in Python ist nur eine Referenz.
Wie auch immer, es sollte nun klar sein worauf ich hinaus wollte.
...
So eine ``id`` bringt mich nicht wirklich weiter. Ich kann damit nur herausfinden das zwei Namen auf die gleiche Speicheradresse zeigen (Oder besser gesagt auf den gleichen Inhalt). -- Es ist also gerade brauchbar um zu testen ob zwei Objekte die gleiche Identität haben. Und wie oft muss man sowas testen?
Wie BlackJack schon sagt, für mich ist es relevant welche Werte ein Name hat und an welches Objekt es gebunden ist. Das alles kann ich mit ``repr`` rausfinden (Wenn ich ``__repr__`` selber Sinnvoll überladen habe):
Code: Alles auswählen
src = """** test **"""
dwlex = DauCMSWikiLexer(src)
print repr(dwlex)
Output:
Code: Alles auswählen
<dcmswlex.DauCMSWikiLexer: [[('MARKUP_BOLD', None), ('LITERAL', ' test '), ('MARKUP_BOLD', None)]]>
Und wenn du unbedingt auch zusätlich die ``id`` angezeigt habe willst, dann fügst du zusätzlich in ``__repr__`` ein ``id(self)`` hinzu, ...
Code: Alles auswählen
def __repr__(self):
return "<%s.%s: %r @ ID: %d>" % (
_NAME_OF_THIS_MODULE, self.__class__.__name__, self._token_stream,
id(self)
)
Output wäre z.B.:
Code: Alles auswählen
<dcmswlex.DauWikiLexer: [[('MARKUP_BOLD', None), ('LITERAL', ' test '), ('MARKUP_BOLD', None)]] @ ID: 10373328>
... das IMHO aber unnötig ist, da wie gesagt mehrere Namen auch die gleiche Identität (id) habe können, falls die besagten auf das instanziierte referenziert sind.
Wenn mich nur der Wert interessiert (Und ich ``__str__`` überladen habe), genügt nur ein einfaches ``print dwlex``.
Fazit für mich: Die Überladung von ``__repr__`` ist für mich genauso unersätzlich wie die Überladung von ``__str__``. ``repr()`` nutze ich ziemlich oft, wohingegen ich ``id`` so gut wie garnicht brauche.
lg