konstruktor

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
ertlpott
User
Beiträge: 44
Registriert: Montag 14. April 2003, 16:05

was ist ein konstruktor im zusammenhang mit einer klasse :oops:

cu

ertlpott
Dookie
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.

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
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
ertlpott
User
Beiträge: 44
Registriert: Montag 14. April 2003, 16:05

ok danke.
ertlpott
User
Beiträge: 44
Registriert: Montag 14. April 2003, 16:05

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:

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
doch das einzige was ich von meinem kasten zurückbekomme ist eine endlosschleife, die irgendwann einmal automatisch unterbrochen wird.
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
ich kann mir vorstellen, dass der fehler bei __setattr__ liegt da ich diese methode nicht wirklich beherrsche.

danke schon im voraus

Simon
Dookie
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.

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
Dookie
ertlpott
User
Beiträge: 44
Registriert: Montag 14. April 2003, 16:05

aber das ist eignetlich komisch, weil da setze ich ja eignetlich auch ein attribut fest!?

auf jeden fall,
danke

bis die tage

ertlpott
Dookie
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
Antworten