Konstruktor mit Parameterübergabe

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
Benutzeravatar
Arthur Dent
User
Beiträge: 23
Registriert: Montag 12. September 2011, 09:51

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
Optimismus ist, bei Gewitter auf dem höchsten Berg in einer Kupferrüstung zu stehen und "scheiß Götter" zu rufen

Terry Pratchett
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

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!
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
Benutzeravatar
Arthur Dent
User
Beiträge: 23
Registriert: Montag 12. September 2011, 09:51

Verdammt!

Das hab ich tatsächlich mal irgendwo gelesen. Vielen Dank.
Diese Syntax ist für mich allerdings auch etwas ungewohnt.
Optimismus ist, bei Gewitter auf dem höchsten Berg in einer Kupferrüstung zu stehen und "scheiß Götter" zu rufen

Terry Pratchett
Benutzeravatar
jbs
User
Beiträge: 953
Registriert: Mittwoch 24. Juni 2009, 13:13
Wohnort: Postdam

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.
[url=http://wiki.python-forum.de/PEP%208%20%28%C3%9Cbersetzung%29]PEP 8[/url] - Quak!
[url=http://tutorial.pocoo.org/index.html]Tutorial in Deutsch[/url]
Antworten