Seite 1 von 2

Verfasst: Dienstag 6. Februar 2007, 17:59
von N317V
Richtig! Und die beiden Klassenobjekte heißen A bzw. e (auch wenn das nicht unbedingt zur Ausgangsfrage gehört, aber das hatte er ja nicht gefragt). Die Frage ist doch aber: ist eine Referenz auf ein Objekt eine Einbahnstraße? Kann ich, wenn ich ein Objekt habe, rausfinden, wo oder von wem oder wie es referenziert wird? Gerade der gc müsste sowas doch können, oder? Teilweise geht es ja, wie schon gezeigt wurde.

Hatten wir nicht schonmal so eine Diskussion mit der Frage, ob die Schachtel weiß in welcher Schublade sie steckt? Gut die Schachtel scheint es in diesem Fall nicht zu wissen, weil es ja keine Objekteigenschaft ist, aber vielleicht kann man es trotzdem irgendwie rausfinden. Ich schau mir den gc nochmal an. Ich wüsste nicht, warum ich Skrupel haben sollte den einzusetzen.

Verfasst: Dienstag 6. Februar 2007, 18:10
von birkenfeld
netzmensch hat geschrieben:
birkenfeld hat geschrieben:
Als sauber würde ich das nicht bezeichnen. Den GC betrachte ich eher als Implementationsdetail, auf den ich mich nicht verlassen will.
und was würdest du dann als alternative bezeichnen?
So etwas z.B.:

Code: Alles auswählen

class A(object):
    instances = []
    def __new__(cls, *args, **kwds):
        instance = object.__new__(cls, *args, **kwds)
        A.instances.append(instance)
        return instance

Verfasst: Dienstag 6. Februar 2007, 18:19
von birkenfeld
N317V hat geschrieben:Richtig! Und die beiden Klassenobjekte heißen A bzw. e (auch wenn das nicht unbedingt zur Ausgangsfrage gehört, aber das hatte er ja nicht gefragt). Die Frage ist doch aber: ist eine Referenz auf ein Objekt eine Einbahnstraße? Kann ich, wenn ich ein Objekt habe, rausfinden, wo oder von wem oder wie es referenziert wird? Gerade der gc müsste sowas doch können, oder? Teilweise geht es ja, wie schon gezeigt wurde.
Das kannst du ja auch machen. Nur es dazu zu missbrauchen, irgendwelche Namen von Objekten herauszufinden, ist sinnlos, gerade weil diese Namen immer nur im Kontext eines bestimmten Namensraums gültig sind. Andere Objekte haben, wie demonstriert, gar keinen Namen.

Code: Alles auswählen

a = []
b = {}
x = object() # (*)
x.a = b
x.b = a
Jetzt versuch mal herauszubekommen, was "a" ist. Innerhalb des Modulnamensraumes ist es eine Liste, innerhalb des Namensraumes von "x" ein Dict. Und ganz wo anders wiederum... etc.

Dein vorhin geposteter Code funktioniert z.B. nur mit Instanzen, die im selben Modul-Namensraum wie die Klasse definiert werden.

(*) Ja, ich weiß, dass man Instanzen von object nicht einfach Attribute zuweisen kann, das spielt aber hier keine Rolle.
Hatten wir nicht schonmal so eine Diskussion mit der Frage, ob die Schachtel weiß in welcher Schublade sie steckt? Gut die Schachtel scheint es in diesem Fall nicht zu wissen, weil es ja keine Objekteigenschaft ist, aber vielleicht kann man es trotzdem irgendwie rausfinden. Ich schau mir den gc nochmal an. Ich wüsste nicht, warum ich Skrupel haben sollte den einzusetzen.
Ihn für seinen Zweck einzusetzen ist sinnvoll. Ihn für etwas einsetzen zu wollen, was sinnlos ist, ist sinnlos.

Verfasst: Mittwoch 7. Februar 2007, 10:14
von N317V
birkenfeld hat geschrieben:

Code: Alles auswählen

a = []
b = {}
x = object() # (*)
x.a = b
x.b = a
Jetzt versuch mal herauszubekommen, was "a" ist.
Andersrum, ich hab <list object at 0x011493C8> und will wissen wie darauf referenziert wird und die Antwort ist ja wohl ganz klar: a und x.b

Verfasst: Mittwoch 7. Februar 2007, 10:17
von birkenfeld
N317V hat geschrieben:
birkenfeld hat geschrieben:

Code: Alles auswählen

a = []
b = {}
x = object() # (*)
x.a = b
x.b = a
Jetzt versuch mal herauszubekommen, was "a" ist.
Andersrum, ich hab <list object at 0x011493C8> und will wissen wie darauf referenziert wird und die Antwort ist ja wohl ganz klar: a und x.b
Diese Antwort programmatisch zu geben, wird dir aber schwerfallen.

Verfasst: Mittwoch 7. Februar 2007, 10:49
von N317V
birkenfeld hat geschrieben:Diese Antwort programmatisch zu geben, wird dir aber schwerfallen.
Tut es auch. Richtig schwer sogar. Darum frag ich ja. :-)