was ist ein konstruktor im zusammenhang mit einer klasse
cu
ertlpott
konstruktor
-
- Python-Forum Veteran
- Beiträge: 2010
- Registriert: Freitag 11. Oktober 2002, 18:00
- Wohnort: Salzburg
- Kontaktdaten:
Hi ertlpott,
der "Konstruktor" ist der Teil bzw die Methode einer Klasse, die beim erzeugen einer Instanz aufgerufen wird um die Instanz zu initialisieren. Bei Python ist das die __init__() Methode.
Je nach Klasse, kann der Constructor verwendet werden um Objekte einer anderen Klasse in die neue Klasse zu überführen. z.B. list("ABC") erzeugt aus dem String "ABC" die Liste ["A", "B", "C"].
Gruß
Dookie
der "Konstruktor" ist der Teil bzw die Methode einer Klasse, die beim erzeugen einer Instanz aufgerufen wird um die Instanz zu initialisieren. Bei Python ist das die __init__() Methode.
Code: Alles auswählen
>>> class Test:
... def __init__(self, wert="Hallo Welt"):
... self.text = wert
...
>>> objekt = Test()
>>> print objekt.text
Hallo Welt
>>> objekt = Test("Ein anderer Text")
>>> print objekt.text
Ein anderer Text
Gruß
Dookie
hänge schon wieder bei einer übung in meinem buch.
Ich möchte eine klasse schreiben, die überwacht, ob ich ein attribut zuweise und mir dann eine nachricht ausgibt, welches attribut ich wie zugewiesen habe. meine überlegungen sahen bisher folgendermaßen aus:
doch das einzige was ich von meinem kasten zurückbekomme ist eine endlosschleife, die irgendwann einmal automatisch unterbrochen wird.
die sieht etwa so aus:
ich kann mir vorstellen, dass der fehler bei __setattr__ liegt da ich diese methode nicht wirklich beherrsche.
danke schon im voraus
Simon
Ich möchte eine klasse schreiben, die überwacht, ob ich ein attribut zuweise und mir dann eine nachricht ausgibt, welches attribut ich wie zugewiesen habe. meine überlegungen sahen bisher folgendermaßen aus:
Code: Alles auswählen
class meta:
def __init__(self,objekt):
self.data = objekt
def __getattr__(self,other):
print "Trace", other
return getattr(self.data)
def __setattr__(self,other,wert):
print "Trace", other,"=",wert
self.other=wert
die sieht etwa so aus:
Code: Alles auswählen
>>> import sys
>>> sys.path.append("h:\\programme\\klassen")
>>> import meta
>>> x = meta.meta("sabel")
Trace data = sabel
Trace other = sabel
Trace other = sabel
Trace other = sabel
Trace other = sabel
Trace other = sabel
Trace other = sabel
Trace other = sabel
Trace other = sabel
Trace other = sabel
Trace other = sabel
Trace other = sabel
Trace other = sabel
danke schon im voraus
Simon
-
- Python-Forum Veteran
- Beiträge: 2010
- Registriert: Freitag 11. Oktober 2002, 18:00
- Wohnort: Salzburg
- Kontaktdaten:
ja das mit __setattr__ ist nicht ganz trivial. Wenn Du in der Methode __setattr__ einem Attribut einen wert zuweist, in Deinem Beispiel self.other so wird natürlich wieder __setattr__ aufgerufen und so kommts zur Endlosrekursion.
Diesen Teufelskreis gilts zu unterbinden. Das geht über self.__dict__ welches die Attribute in einem Dictionary bereit hält.
Dookie
Diesen Teufelskreis gilts zu unterbinden. Das geht über self.__dict__ welches die Attribute in einem Dictionary bereit hält.
Code: Alles auswählen
class meta:
def __init__(self,objekt):
self.data = objekt
def __getattr__(self,other):
print "Trace", other
return self.__dict__[other]
def __setattr__(self,other,wert):
print "Trace", other,"=",wert
self.__dict__[other] =wert
-
- Python-Forum Veteran
- Beiträge: 2010
- Registriert: Freitag 11. Oktober 2002, 18:00
- Wohnort: Salzburg
- Kontaktdaten:
self.__dict__ ist ein Attribut, das jede Klasse enthält, hier sind eben die "normalen" Attribute abgelegt. Darum umgeht der Zugriff darauf den nomalen Weg des Zugriffs auf ein Klassenatribut.
Dookie
Dookie