Namen von Instanzen als String

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
Kartoffel
User
Beiträge: 66
Registriert: Montag 7. April 2003, 17:08

So, ich habe wieder mal ein "kleines" Problem und hoffe mal, dass es nicht wieder in eine endlose Diskussion ausartet:

Wie kann ich den Namen einer Instanz als String ausgeben:

so dass wenn ich eine Funktion
test.drucke_name()
aufrufe,
'Die Instanz heisst test'
ausgegeben wird.
joerg
User
Beiträge: 188
Registriert: Samstag 17. August 2002, 17:48
Wohnort: Berlin
Kontaktdaten:

Kartoffel hat geschrieben:So, ich habe wieder mal ein "kleines" Problem und hoffe mal, dass es nicht wieder in eine endlose Diskussion ausartet.
Zu früh gefreut. Was Dir als kleines Problem vorkommt, kann es ganz schön in sich haben.

Ein Python-Objekt weiß erstmal nichts von seinen 'Namen', also von all den Stellen, von denen es referenziert werden kann.

Es kann ja viele Namen haben, oder auch nur als Element in einer Liste auftauchen, ohne direkt über einen einfachen Namen ansprechbar zu sein.

Kurz gesagt: Das ist meiner Meinung nach so einfach nicht möglich.

Jörg
Kartoffel
User
Beiträge: 66
Registriert: Montag 7. April 2003, 17:08

Schade :cry:
Ich nehme an, es ist auch nicht einfacher, den Namen dann abzufangen, wenn die Instanz initialisiert wird. (Dann wäre es ja genau ein Namen)
ertlpott
User
Beiträge: 44
Registriert: Montag 14. April 2003, 16:05

Ich würde dass einfach so lösen, dass du in deiner Klasse eine __init__(self,name) Funktion definierst, wo du dann deine Variable der du die Klasse zugewiesen hast, als name einsetzt und der Name der Klasse dann als self.name eingebaut

Ist zwar alles andere als elegant, aber die einzige Möglichkeit auf die ich gekommen bin.

Hoffe dass reicht dir :?

grüße

Simon
Kartoffel
User
Beiträge: 66
Registriert: Montag 7. April 2003, 17:08

ertlpott hat geschrieben:Ich würde dass einfach so lösen, dass du in deiner Klasse eine __init__(self,name) Funktion definierst, wo du dann deine Variable der du die Klasse zugewiesen hast, als name einsetzt und der Name der Klasse dann als self.name eingebaut

Ist zwar alles andere als elegant, aber die einzige Möglichkeit auf die ich gekommen bin.

Hoffe dass reicht dir :?

grüße

Simon
Hm, ich weiß nicht ob ich das richtig verstanden habe.
Der Aufruf müsste dann so aussehen bla=test("bla"), wenn nicht bitte noch mal erklären.
ertlpott
User
Beiträge: 44
Registriert: Montag 14. April 2003, 16:05

Ganz genau.
Sieht zwar etwas blöd aus, aber wenn du dass jetzt gleich so machst, bist du bestimmt schneller, als wenn du noch länger nach einer eleganteren Lösung suchst :wink:

LG

ertlpott
Kartoffel
User
Beiträge: 66
Registriert: Montag 7. April 2003, 17:08

Ist nicht das, wonach ich suche.

Eigentlich hatte ich auch gar nicht vor, den String tatsächlich auszudrucken (Hätte ich evtl. dazusagen sollen :oops: ). ich will ein Programm schreiben, bei dem eine Instanz einer Klasse ein Canvas-Objekt erstellt und den Namen als Tag angeben dass ich es einfach mit itemconfig ansprechen kann.
Ich bin jetzt drauf gekommen, dass ich es eigentlich auch über self machen könnte:

Code: Alles auswählen

from Tkinter import *
a=Canvas()
a.pack()

class test:
    def __init__(self):
        a.create_arc(10,10,100,100, tag=`self`)

x=test()
a.itemconfig(`x`, fill="blue")

Das klappt aber auch nicht. self und `x` sind das selbe. Kann mir jemand sagen wo hier das Problem liegt?
Voges
User
Beiträge: 564
Registriert: Dienstag 6. August 2002, 14:52
Wohnort: Region Hannover

Hallo!
Kartoffel hat geschrieben: ich will ein Programm schreiben, bei dem eine Instanz einer Klasse ein Canvas-Objekt erstellt und den Namen als Tag angeben dass ich es einfach mit itemconfig ansprechen kann.
Willst Du vielleicht sowas?

Code: Alles auswählen

a.create_arc(10,10,100,100,tags="bla")

a.itemconfig("bla", fill="blue")
Jan

Nachtrag: Jetzt weiß ich vielleicht, was Du willst.

Code: Alles auswählen

a=Canvas(tk)
a.pack()

def createArc(canv):
    item = canv.create_arc(10,10,100,100)
    tagName = str(id(canv)) + "_" + str(item)
    canv.itemconfig(item,tags=tagName)
    return tagName

x = createArc(a)
a.itemconfig(x, fill="blue")
Wie der Name lautet, ist Dir eigentlich egal. Wichtig ist aber, das er eindeutig ist. Eine Objekt-Referenz wäre das zum Beispiel. Canvas-Items haben aber keine Referenz, sondern nur eine Nummer innerhalb des Canvas. Aber die Kombination aus Canvas-Referenz und Item-Nummer müsste eindeutig sein.
Naja, ein bisschen verrückt das Ganze ;-)
Jan
Kartoffel
User
Beiträge: 66
Registriert: Montag 7. April 2003, 17:08

Passt bei mir nicht ganz.
Ich habe eine Klasse, die mehrere CAnvas-Objekte erstellt.
Jedem dieser Objekte soll den selben Tag zugewiesen werden, aber es soll eindeutig definiert werden, welcher Instanz diese Objekte angehören, sodass ein Aufruf

canv.itemconfig(instanzname.tag, fill="blue")

alle Canvas-Objekte die von der Instanz instanzname erstellt wurden, blau färbt.

Ich wollte das mit self machen, da das ja der druckbaren Form der Instanz entspricht und eindeutig ist:

str(self)=str(f)
wenn self der erste Parameter in einer Funktionsdefinition in der Klassendefinition von der Klasse ist, zu der f gehört.

Soweit ich weiß, bewirken tag und tags doch das selbe, oder etwa nicht?
Voges
User
Beiträge: 564
Registriert: Dienstag 6. August 2002, 14:52
Wohnort: Region Hannover

Hallo!
Kartoffel hat geschrieben:Soweit ich weiß, bewirken tag und tags doch das selbe, oder etwa nicht?
Komisch, tag habe ich nirgends dokumentiert gefunden, funktioniert aber auch.

Der springende Punkt ist, dass als tag-Wert wohl nicht alles erlaubt ist. `self` ist ja sowas wie <__main__.test instance at 0x00A78100>. Aber tag-Werte dürfen keine Leerzeichen enthalten. Eine Möglichkeit wäre "_"+str(id(self)). Das "_" vorab ist nötig, da ein Tag-Wert wohl nicht nur aus Ziffern bestehen darf.
Aber a.itemconfig("_"+str(id(x)), fill="blue") sieht dann auch nicht mehr so toll aus.
Jan
Kartoffel
User
Beiträge: 66
Registriert: Montag 7. April 2003, 17:08

ich habs auch nirgends dokumentiert gefunden , allerdings habe ich auch tags nicht dokumentiert gefunden(inzwischen schon) und wollte tags nicht immer extra mit addtag hinzufügen.
Also hab ich einfach mal auf gut Glück tag genommen und es hat funktioniert :lol: (Glück muss man haben...)

Kann ich self irgendwie für meine Klasse überladen, dass es ein Srting ohne Leerzeichen ist?
Voges
User
Beiträge: 564
Registriert: Dienstag 6. August 2002, 14:52
Wohnort: Region Hannover

[Hallo Hans. Ich glaub', mittlerweile könnte der Thread verschoben werden (ebenso der "tree klasse"-Thread).]
Kartoffel hat geschrieben:Kann ich self irgendwie für meine Klasse überladen, dass es ein Srting ohne Leerzeichen ist?
Nein, eine Referenz ist eine Referenz. Da wirst Du nichts drehen können.

Ich weiß ja nicht, was für Kabinettstückchen Du da vor hast, aber ich vermag nicht so ganz einzusehen, warum Du das unbedingt mit einer Klasse machen willst. Wenn Du eine Instanz der Klasse erzeugst, gibt es eben nur eine Referenz.
Wenn Du eine Funktion benutzt, kannst Du zurückgeben, was Du willst. Und auch in einer Funktion kannst Du mehrere Canvas-"Objekte" (genauer -Items) erzeugen, die alle den gleichen tags-Wert haben können und gleichzeitig geändert werden können.
Jan
Voges
User
Beiträge: 564
Registriert: Dienstag 6. August 2002, 14:52
Wohnort: Region Hannover

Hallo Nochmal,
Du könntest in Deiner Klasse __repr__() überschreiben:

Code: Alles auswählen

    def __repr__(self):
        return "_"+str(id(self))
Vielleicht geht das.
Jan
Kartoffel
User
Beiträge: 66
Registriert: Montag 7. April 2003, 17:08

Danke, hat geholfen.
Antworten