Seite 1 von 1

Konstruktor mit Parameterübergabe

Verfasst: Montag 12. September 2011, 10:38
von Arthur Dent
Hallo

Zum ersten sei erwähnt, dass ich ein absoluter Python-Neuling bin. Ich habe jedoch ein wenig Erfahrung mit kompilierten sprachen wie Delphi oder C#. Python kannte ich bislang nur vom Hörensagen, bin dann allerdings, auf der Suche nach einer guten Numerik-Bibliothek, auf das NumPy und SciPy Projekt gestoßen und wollte mir die Sprache daher etwas näher anschauen. Ich Stütze mich dabei auf die mitgelieferte Dokumentation sowie das Open-Book zu python und alles andere was man im Netz so findet.

Bei meinen ersten Gehversuchen mit Python bin ich jedoch auf ein für mich unverständliches Problem, beim Erstellen von konstruktoren mit Parameterübergabe, gestoßen.
Ich wollte mir zum Üben eine einfache Klasse namens node erstellen, welche im Konstruktor die Parameter X-Position und Y_Position übergibt. Hier mein Versuch

Code: Alles auswählen

class node:
    
    def _init_(self, x_pos, y_pos):
       
        self.x = x_pos
        self.y = y_pos
:

Beim Instanzieren eines node-Objektes hätte ich jetzt eigentlich erwartet, dass der Konstrukter schon die Parameter x_pos und y_pos erwartet.

Code: Alles auswählen

Knoten = node(0,5)
Der Aufruf führt jedoch zu folgendem Fehler:
Traceback (most recent call last):
File "C:\.....\Python\Klasses_Test\src\subs\Node.py", line 8, in <module>
Knoten = node(0,5)
TypeError: this constructor takes no arguments
Daraufhin hab ich die Dokumentation und das Netz nach Beispielen zur Definition von Konstruktoren durchsucht, konnte jedoch bei keinem einen Unterschied zu meiner Variante finden. Seh ich den Wald vor Bäumen nicht? Was ist schief gegangen? Ich würde mich wahnsinnig freuen wenn mir dass jemand erklären könnte

Falls das wichtig ist:
Ich benutze Python Version 2.6.6 auf Windows XP zusammen mit EasyEclipse for Python Version: 1.3.1

Gruß Arthur Dent

Re: Konstruktor mit Parameterübergabe

Verfasst: Montag 12. September 2011, 10:41
von Hyperion
Dein "Konstruktor" - welcher in Wirklichkeit keiner ist - ist falsch benannt:

Code: Alles auswählen

In [6]: class Node(object):
   ...:     def __init__(self, x, y):
   ...:         self.x = x
   ...:         self.y = y
   ...:         

In [7]: n = Node(4, 6)

In [8]: n
Out[8]: <__main__.Node at 0xd959d0>

In [9]: n.x
Out[9]: 4

In [10]: n.y
Out[10]: 6
Man nennt das auch `init`-Methode. Wichtig sind die doppelten Unterstriche!

Re: Konstruktor mit Parameterübergabe

Verfasst: Montag 12. September 2011, 10:51
von Arthur Dent
Verdammt!

Das hab ich tatsächlich mal irgendwo gelesen. Vielen Dank.
Diese Syntax ist für mich allerdings auch etwas ungewohnt.

Re: Konstruktor mit Parameterübergabe

Verfasst: Montag 12. September 2011, 12:55
von jbs
Doppelte Unterstriche sollten dir noch öfters über den Weg laufen. Sie werden meist für Methoden verwendet, die Protokolle bedienen.

Zum Beispiel ruft `len` die Methode `__len__` eines Objektes auf.