Klasse wird nicht gefunden ?!?

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
BastiFantasti
User
Beiträge: 7
Registriert: Dienstag 28. Oktober 2008, 11:32

Hallo habe folgendes Problem:

Code: Alles auswählen

import csv

class maily():
   def __init__(self):
      self.adress = []
      self.temptxt = ''
      self.temphtml = ''
      
  def LoadAdress(self):
      #Funktion OK
      try:
        tempadr = open('vorl/adress.csv',  'r')
        test = csv.reader((tempadr),  delimiter=';')
        self.adress = []
        for row in test:
           self.adress.append(row)
        tempadr.close()
      except:
         print ('Adress file is missing')
         exit()
  def LoadTempTxt(self):
      try:
         file_txt = open('vorl/muster.txt',  'r')
         self.temptxt = file_txt.readlines()
         file_txt.cose()
      except:
          print('muster.txt is missing')
          exit()
  def LoadTempHtml(self):
      try:
          file_html = open('vorl/muster.html',  'r')
          self.temphtml = file_html.readlines()
          file_html.close()
      except:
          print('muster.html is missing')
          exit()
    
wenn ich dieses file manuell in die python shell lade (mit from maily import *)
klappt das soweit ohne Fehler.

Ich kann mir eine Instanz erzeugen mit z.B.

Code: Alles auswählen

n = maily()

n.LoadAdress()


funktioniert. und ich hab dann auch die n.adress Variable belegt.
Beim Aufruf der LoadTempTxt Funktion steigt das Programm immer aus.

Wenn ich genau diese Schritte aber manuell mache klappts...

Grüße

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

- Klassenname und Methodennamen nicht PEP8-kompatibel. Ebenso die falschen Zeilenabstände

- Klassen sollten von "object" erben (new Style)

- ich würde Datein immer mit dem with-Statement öffnen

- execpt ohne konkrete Angabe einer Exception ist immer eine schlechte Idee. So bekommst Du nie mit, was evtl. außer einer nicht exitierenden Datei schief laufen kann.

- Mir ist unklar, was nun genau nicht klappt! Du schreibst das wirres Zeug imho und wirfst durcheinander, was wann wie klappt und wann nicht. Was bedeutet z.B. "manuell"?

- Man sollte niemals "*"-Importe machen. Importiere lieber so:

Code: Alles auswählen

# module = Name Deines Moduls
import module
# oder
from module import foo, bar
Also erkläre bitte noch einmal genau, was Du wie probierst, was klappt, was nicht klappt, die Fehlermeldung und was Du erwartet hättest. Dann kann man Dir sicherlich auch helfen :-)
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

Code: Alles auswählen

file_txt.cose()
Wenn du nicht alle Exceptions abfangen würdest, dann hättest du das auch gemerkt ;-)
Das Leben ist wie ein Tennisball.
BlackJack

@BastiFantasti: `exit()` sollte man nur in der Hauptfunktion oder zumindest ziemlich weit oben in der Aufrufhierarchie machen, aber nicht in der Business-Logik. Damit nimmt man sich die Möglichkeit anders darauf zu reagieren, zum Beispiel den Benutzer nach einer Korrektur des Problems zu befragen.

Sofern der Aufruf aller drei Methoden erforderlich ist, um `maily`-Exemplare verwenden zu können, sollten das eher Funktionen ausserhalb sein, mit dem Dateinamen als Argument und den Daten als Rückgabewert, und die Daten sollten über die `__init__()` in die Klasse kommen. Insbesondere könnte man den Text und das HTML mit nur *einer* Funktion aufrufen, denn ausser dem Ziel und dem Dateinamen sind die ja gleich.

`test` ist ein schlechter Name für den `csv.reader`. Letztlich braucht man weder den Namen, noch die Schleife. Wenn `address_file` die geöffnete Datei ist: ``self.addresses = list(csv.reader(address_file, delimiter=';'))``.
BastiFantasti
User
Beiträge: 7
Registriert: Dienstag 28. Oktober 2008, 11:32

ui ui ui da kommt ja ordentlich kritik zusammen - aber trotzdem Danke! Nur so lernt man was :-)
Ich hab das mit der Objektorientierung noch nicht so ganz begriffen glaub ich.

@ExDu: Stimmt, war ein Leichtsinnsfehler ;)

Hab jetzt die Klasse etwas kompakter gemacht und versucht das eine oder andere zu beherzigen. Und siehe da - es funktioniert so weit.

Code: Alles auswählen

import csv

class maily():
    def __init__(self):
        self.adress = []
    def LoadAdress(self, address_file):
        self.address = list(csv.reader(address_file, delimiter=';'))        
    def LoadTemplate(self, file2load):
        f = open(file2load,  'r')
        content = f.readlines()
        f.close()
        return content
hab aus den beiden Funktionen um die Templates zu laden eine gemacht und geb den Wert wie BlackJack geschrieben hat nun zurück an den Aufrufer.

@Hyperion:
wie muss ich das mit dem "object" anstellen? Hab mich durch das Tutorial auf
http://www.way2python.de gekämpft und da stand alles mit self...
oder was genau meinst du damit

Das Exception handling hab ich auch wieder ganz rausgemacht, weiß da nämlich auch noch net wie's klappt (hab das mal einfach aus dem tutorial geklaut
:oops: )

Code: Alles auswählen

Python 2.6.4rc1 (r264rc1:75270, Oct 10 2009, 02:40:56) 
[GCC 4.4.1] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> from mailyclass import maily
>>> n = maily()
>>> n.LoadAdress('vorl/adress.csv')
>>> txt = n.LoadTemplate('vorl/muster.txt')
>>> html = n.LoadTemplate('vorl/muster.htm')
>>> print txt
['Text Text Text.\n']
>>> print html
['<html>\n', '<head>\n', '</head>\n', '<body>\n', 'Hallo.\n', 'Welt\n', '</body>\n', '</html>\n', '\n']
>>> 
Aber für nen ersten Versuch ists doch gar net so schlecht, oder?
ms4py
User
Beiträge: 1178
Registriert: Montag 19. Januar 2009, 09:37

Bitte beachte noch die PEP8. Da steht unter anderem, dass Klassennamen in ``CamelCase`` und Funktions-/Methodenname als ``meine_funktion`` bezeichnet werden sollen.
BastiFantasti hat geschrieben: @Hyperion:
wie muss ich das mit dem "object" anstellen? Hab mich durch das Tutorial auf
Klassen immer von ``object`` erben (falls die Klasse natürlich nicht schon von einer anderen Klasse erbt). Dann handelt es sich um eine sog. New-Style-Klasse (und bietet viele überschreibbare Methoden, die die Implementierung eines eigenen Datentyps erheblich vereinfachen):

Code: Alles auswählen

class Maily(object):
  def load_address(self, address_file):
    ...
Allerdings ist die Verwendung von OOP in diesem Code bisher sinnfrei. Du solltest dich vielleicht auch noch genauer mit dem Paradigma beschäftigen.
BastiFantasti
User
Beiträge: 7
Registriert: Dienstag 28. Oktober 2008, 11:32

ich versuch ja grad zu lernen, wie das mit dem OOP so richtig klappt und wie das wann Sinn macht.

Code: Alles auswählen

import csv

class MailDef(object):
    def __init__(self):
        self.adress = []
    def Load_Adress(self, adr_file):
        adr_handle = open(adr_file, 'r')
        self.adress = list(csv.reader((adr_handle), delimiter=';'))
        adr_handle.close()
    def Load_Template(self, file2load):
        f = open(file2load,  'r')
        content = f.readlines()
        f.close()
        return content
Die Load_Adress Funktion klappt allerdings nur, wenn ich die Datei vorher mit open öffne und dann das Handle übergebe...
ms4py
User
Beiträge: 1178
Registriert: Montag 19. Januar 2009, 09:37

BastiFantasti hat geschrieben: Die Load_Adress Funktion klappt allerdings nur, wenn ich die Datei vorher mit open öffne und dann das Handle übergebe...
Ja! Muss auch so sein.
Am besten öffnest du Dateien mit ``with``:

Code: Alles auswählen

with open('file.txt') as file_handle:
  # use file_handle
Die Methodennamen solltest du noch klein schreiben (load_address, load_template).
BlackJack

@BastiFantasti: Was soll denn ein `Maily`- oder ein `MailDef`-Objekt sein? Welche Daten kapselt es und welche Operationen darauf bietet es an? Bis jetzt sieht man halt noch keinen richtigen Sinn in dieser Klasse.
Antworten