Problem mit Objektorientierung

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
linde_user
User
Beiträge: 25
Registriert: Mittwoch 20. April 2005, 11:47

Montag 23. Mai 2005, 10:10

Hallo,

ich habe bei meinem ersten Versuch einer Objektorientierten Programmierung ein funktionierendes Pythonscript genommen und es mit Hilfe von Class und def() in einzelteile zerhackt. leider kommt plötzlich eine undefinierbare endlosliste von Fehlermeldungen. Hier ist mal der Quelltext:

Code: Alles auswählen

# -*- coding: cp1252 -*-
import gui_thread
gui_thread.start() 
from scipy import plt
from scipy import *


class FileWork:
    def __init__(self):
        self.f=file('X:/PythonXX/py_arb_dateien/0407.txt', 'r') # Datei Öffnen
        self.cols1 = []                      #Array definieren
        self.cols2 = []
        self.cols3 = []


    def open(self): 
        for line in self.f:                  #Schleife über alle Einträge in Datei
            sline = line.split() 
            try: 
                v1 = int(sline[0]) 
                v2 = float(sline[1])
                v3 = float(sline[2])
                
                self.cols1.append(v1)
                self.cols2.append(v2)
                self.cols3.append(v3)
            except ValueError: 
                pass 
            except IndexError: 
                pass
        self.f.close()


    def drucken(self):
        a=array(self.cols2)
        b=array(self.cols3)
        tck=interpolate.splrep(a,b,k=2,s=0)           #Linien interpolieren
        unew=arange(0,20,0.1)                         #Bereichseinteilung
        out=interpolate.splev(a,tck,der=0)            #Linien erzeugen
        plt.plot(a,b,'x',a,out)                     #plot


    def Tension(self):    
        return self.cols3
    def Place(self):
        return self.cols2
    
def main():
    druck=FileWork()
    druck.drucken()

if __name__ == '__main__': 
    main() 
Also folgendes will ich realisieren: ein Objekt mit den Variablen Dateiname und drei Listen (arrays), und den Funktionen:
1.File auslesen (Listen erzeugen)- funktioniert bisher ohne OOP
2.einen Plot aus zwei der Listen erstellen - funktioniert ohne OOP ebenfalls
3.die beiden gedruckten listen sollen für weitere Berechnungen zur Verfügung stehen (Ziel der Übung)
Kann jemand einem OOP Anfänger da ein paar Tips geben?

Hier ist mal die Fehlermeldung, falls einer Lust hat die zu lesen:

Traceback (most recent call last):
File "C:\Python23\Zerlegung.py", line 3, in ?
gui_thread.start()
File "C:\Python23\lib\site-packages\gui_thread\__init__.py", line 73, in start
wxPython_thread()
File "C:\Python23\lib\site-packages\gui_thread\wxPython_thread.py", line 111, in wxPython_thread
for name in get_extmodules('wxPython',pexec):
File "C:\Python23\lib\site-packages\gui_thread\wxPython_thread.py", line 22, in get_extmodules
assert not sys.modules.has_key(module),\
AssertionError: wxPython is already imported, cannot proceed
Ich danke schon mal im vorraus falls einer interesse hat mir bei der recht umfangreichen Frage zu helfen.

EDIT by mawe: Code in Python-tags gesetzt
Gast

Montag 23. Mai 2005, 10:47

[quote="linde_user"]Hallo,

ich habe bei meinem ersten Versuch einer Objektorientierten Programmierung ein funktionierendes Pythonscript genommen und es mit Hilfe von Class und def() in einzelteile zerhackt. leider kommt plötzlich eine undefinierbare endlosliste von Fehlermeldungen. Hier ist mal der Quelltext:

Code: Alles auswählen

# -*- coding: cp1252 -*-
import gui_thread
gui_thread.start() 
from scipy import plt
from scipy import *
[/quote]

Wenn Du from scipy import * verwendest, wird alles importiert, inkl. plt. Die Zeile 'from scipy import plt' ist also überflüssig
[quote="linde_user"]
class FileWork:
    def __init__(self):
        self.f=file('X:/PythonXX/py_arb_dateien/0407.txt', 'r') # Datei Öffnen
        self.cols1 = []                      #Array definieren
        self.cols2 = []
        self.cols3 = []


    def open(self): 
        for line in self.f:                  #Schleife über alle Einträge in Datei
[/quote]
Du hast die Datei noch gar nicht gelesen, sondern nur geöffnet. file() gibt nur einen "handle" zurück. Probier's mal mit file('X:/PythonXX/py_arb_dateien/0407.txt', 'r').read(). Im übrigen rufst Du die Funktion open() (die anders heißen sollte, denn open ist eine Python-Funktion) nirgendwo auf, soweit ich sehen kann.

Das sind die Dinge, die mir so beim ersten Drübergucken aufgefallen sind. Das Modul scipy habe ich überhaupt noch nicht verwendet, und da ich keine NatWis bin, weiß ich auch nicht, was Du da eigentlich tust. Ich hoffe, die Hinweise helfen Dir trotzdem weiter.

Gruß

Luzie
Gast

Montag 23. Mai 2005, 11:05

Gast hat geschrieben:.../py_arb_dateien/0407.txt', 'r').read().
Also read() ist natürlich Blödsinn. Wenn Du die Datei zeilenweise einlesen willst brauchst Du readlines(), damit bekommst Du eine Liste, die alle Zeilen der Datei enthält.

Gruß

Luzie[/quote]
CM
User
Beiträge: 2464
Registriert: Sonntag 29. August 2004, 19:47
Kontaktdaten:

Montag 23. Mai 2005, 11:10

Einspruch Euer Ehren!

Eigentlich ist der Ansatz von linde_user nicht schlecht. Ich würde in __init__ gar nichts von einem File schreiben, alles in open() packen, open() umbennen (!), damit ich nicht die builtin-Methode überschreibe, und kein read, readlines oder sonst so etwas verwenden. Wenn man dann noch den Filenamen an das neue open() übergibt, hat man eine schöne und flexible Methode.

Das Problem mit dem gui_thread klingt allerdings sehr seltsam: Ich habe es genauso bei mir (OS X, wxPython 2.5.3.1) probiert und erhalte keine Fehlermeldung. Warum Du, lind_user, einer erhälst kann ich nicht sagen. Vielleicht kommen wir drauf, wenn Du noch die Versionen der verwendeten Module (alle!), des Betriebssystems und der Installationsbedingungen (von Source oder binary installer?) postest? Aber das ist leider nur ein Schuß ins Blaue.

Gruß,
Christian
mawe
Python-Forum Veteran
Beiträge: 1209
Registriert: Montag 29. September 2003, 17:18
Wohnort: Purkersdorf (bei Wien [Austria])

Montag 23. Mai 2005, 11:12

Hi!
Gast hat geschrieben: Du hast die Datei noch gar nicht gelesen, sondern nur geöffnet.
Das passt schon, man kann auch so über eine Datei iterieren:

Code: Alles auswählen

f = file("hello","r")
for l in f:
    print l
Gruß, mawe
linde_user
User
Beiträge: 25
Registriert: Mittwoch 20. April 2005, 11:47

Montag 23. Mai 2005, 11:35

Danke erstmal für die Tips. Ich wollte nur nochmal darauf hinweisen, dass der Programmcode ohne OOP funktioniert hat. Mein ziel ist es die arrays Cols1-3 für eine verwendung außerhalb der Class zur Verfügung zu stellen. Dafür ist die def Tension() und place () gedacht. eigentlich habe ich eher inhaltliche fehlermeldungen erwartet aber keine wx.. usw. ich poste hier mal den Code der FUNKTIONIERENDEN! Ursprungsdatei. Da erkennt vielleicht einer die ursache für den Fehler.

Code: Alles auswählen

# -*- coding: cp1252 -*-
import gui_thread
gui_thread.start() 
from scipy import plt
from scipy import *

def main(): 
    f = file('X:/PythonXX/py_arb_dateien/0407.txt', 'r') # Datei Öffnen
    cols1 = []                      #Array definieren
    cols2 = []
    cols3 = []
    for line in f:                  #Schleife über alle Einträge in Datei
        sline = line.split() 
        try: 
            v1 = int(sline[0]) 
            v2 = float(sline[1])
            v3 = float(sline[2])
            val1 = v1
            val2 = v2
            val3 = v3
            cols1.append(v1)
            cols2.append(v2)
            cols3.append(v3)
        except ValueError: 
            pass 
        except IndexError: 
            pass 
    f.close() 

    
    a=array(cols2)
    b=array(cols3)
    tck=interpolate.splrep(a,b,k=2,s=0)           #Linien interpolieren
    unew=arange(0,20,0.1)                         #Bereichseinteilung
    out=interpolate.splev(a,tck,der=0)            #Linien erzeugen
    plt.plot(a,b,'x',a,out)                     #plot

    print tck

   
    
    
if __name__ == '__main__': 
    main() 
Ich bedanke mich aber trotzdem für die vielzähligen Antworten.

EDIT by mawe: wieder die Python-tags
BlackJack

Montag 23. Mai 2005, 21:24

Vergiss das mit dem umbenennen von `FileWork.open()` wieder. Damit überschreibst Du natürlich nicht die eingebaute `open()` Funktion.
CM
User
Beiträge: 2464
Registriert: Sonntag 29. August 2004, 19:47
Kontaktdaten:

Dienstag 24. Mai 2005, 06:42

Oh ja, richtig: Das habe ich jetzt durcheinandergewürfelt: Mal OO, mal nicht ... :oops:

Gruß,
Christian
Antworten