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.
Namen von Instanzen als String
Zu früh gefreut. Was Dir als kleines Problem vorkommt, kann es ganz schön in sich haben.Kartoffel hat geschrieben:So, ich habe wieder mal ein "kleines" Problem und hoffe mal, dass es nicht wieder in eine endlose Diskussion ausartet.
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
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
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.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
Der Aufruf müsste dann so aussehen bla=test("bla"), wenn nicht bitte noch mal erklären.
Ist nicht das, wonach ich suche.
Eigentlich hatte ich auch gar nicht vor, den String tatsächlich auszudrucken (Hätte ich evtl. dazusagen sollen
). 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:
Das klappt aber auch nicht. self und `x` sind das selbe. Kann mir jemand sagen wo hier das Problem liegt?
Eigentlich hatte ich auch gar nicht vor, den String tatsächlich auszudrucken (Hätte ich evtl. dazusagen sollen

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")
Hallo!
Jan
Nachtrag: Jetzt weiß ich vielleicht, was Du willst.
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
Willst Du vielleicht sowas?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.
Code: Alles auswählen
a.create_arc(10,10,100,100,tags="bla")
a.itemconfig("bla", fill="blue")
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")
Naja, ein bisschen verrückt das Ganze

Jan
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?
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?
Hallo!
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
Komisch, tag habe ich nirgends dokumentiert gefunden, funktioniert aber auch.Kartoffel hat geschrieben:Soweit ich weiß, bewirken tag und tags doch das selbe, oder etwa nicht?
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
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
(Glück muss man haben...)
Kann ich self irgendwie für meine Klasse überladen, dass es ein Srting ohne Leerzeichen ist?
Also hab ich einfach mal auf gut Glück tag genommen und es hat funktioniert

Kann ich self irgendwie für meine Klasse überladen, dass es ein Srting ohne Leerzeichen ist?
[Hallo Hans. Ich glaub', mittlerweile könnte der Thread verschoben werden (ebenso der "tree klasse"-Thread).]
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
Nein, eine Referenz ist eine Referenz. Da wirst Du nichts drehen können.Kartoffel hat geschrieben:Kann ich self irgendwie für meine Klasse überladen, dass es ein Srting ohne Leerzeichen ist?
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
Hallo Nochmal,
Du könntest in Deiner Klasse __repr__() überschreiben:
Vielleicht geht das.
Jan
Du könntest in Deiner Klasse __repr__() überschreiben:
Code: Alles auswählen
def __repr__(self):
return "_"+str(id(self))
Jan