OOP: Frage zu Klassen

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
david
User
Beiträge: 30
Registriert: Montag 12. Januar 2004, 14:40

Hi!

Ich versuche zur Zeit meine python Fähigkeiten um das Verständnis von OOP zu erweitern. Vorher habe ich nie, auch nicht in anderen Sprachen, damit gearbeitet.

Nun zu meinem Problem: Ich hab eine Klasse, die soll mir eine Datei auslesen und den Inhalt der Datei in eine Liste packen. Das klappt soweit. Nun will ich aber aus einer anderen Klasse diese Klasse aufrufen und vor allem die Liste verwenden. So wie ich es gemacht habe geht es leider nicht. Ich denke, dass es nur eine Kleinigkeit ist und hängt wahrscheinlich mit meinem mangelnden OOP-Verständnis zusammen.

Code: Alles auswählen

class ReadSettingsFile:
    def __init__(self,parent):
        self.ReadFile()

    def ReadFile(self):
        FeurioDirectory=os.path.expandvars("$HOME/.wxfeurio")
        HomeDirectory=os.path.expandvars("$HOME/")

        if os.path.exists(FeurioDirectory) is 0:              #existiert also der odner nicht

            os.mkdir(FeurioDirectory)                        #wird er erstellt

        else:
            l=[]
            os.chdir(FeurioDirectory)
            SettingsFile=("Settings_path.txt")
            for line in fileinput.input(SettingsFile):
                l.append(line)
            print l
l ist also meine Liste. Später versuche ich sie aus der anderen Klasse ebenfalls mit l anzusprechen. Auf diese Weise ist l aber nur für die Klasse ReadSettingsFile definiert. Wie kann ich das anders bewerkstelligen?

Grüße, David
RainBowBender
User
Beiträge: 53
Registriert: Dienstag 6. April 2004, 10:33

ersetze l durch self.l

ohne das self ist l einfach eine lokale Variable und wird kurzerhand vom Garbage Collector zerstampft nachdem die Methode zuende ist.
fs111
User
Beiträge: 170
Registriert: Samstag 15. November 2003, 11:42
Kontaktdaten:

Einfach in der __init__-Metodhe als erstes die Liste mit anlegen, also etwa so:

Code: Alles auswählen

class ReadSettingsFile:
    def __init__(self,parent):
        self.liste = [] 
        self.ReadFile()
[...] 

und dann später immer mit self.liste darauf zugreifen. Wenn Du dann Deine Klasse instanziierst, kannst Du einfach mit <name_der_variablen>.liste darauf zugreifen. In anderen Sprachen würde man die Variable private machen, und dann mit öffentlichen get/set Methoden darauf zugreifen, dieses vorgehen scheint aber in Python nicht unbedingt üblich zu sein, wenngleich es durchaus auch möglich ist.

Noch ein kleiner Tipp: Eine Klasse ist ja der Prototyp für ein Objekt, und ein Objekt sollte den Namen einer Sache haben, und nicht den einer Fähigkeit. Einfacher gesagt: Du würdest ja auch kein Objekt Fahren haben wollen, sondern ein Objekt Auto mit der Fähigkeit (Methode) "fahren", deshalb solltest Du die Klasse anders bennenen.

HTH

Grüße fs111
Zuletzt geändert von fs111 am Sonntag 11. Juli 2004, 16:05, insgesamt 1-mal geändert.
Pydoc-Integration in vim - Feedback willkommen: http://www.vim.org/scripts/script.php?script_id=910
Buzzy
User
Beiträge: 12
Registriert: Samstag 3. Juli 2004, 19:20

Ersetze alle "l" durch "self.l" und du kannst auf folgende Weise drauf zugreifen:

Code: Alles auswählen


Settings = ReadSettingsFile(foo)
print Settings.l 



So wie du es gemacht hast, hast du "l" als lokale Variable in "ReadFile()" definiert und kannst nur in dieser Funktion drauf zugreifen.

EDIT: Da haben wohl drei Leute gleichzeitig geantwortet :-)
david
User
Beiträge: 30
Registriert: Montag 12. Januar 2004, 14:40

Danke, so klappts!

Grüße, David


Edit:
Noch ein kleiner Tipp: Eine Klasse ist ja der Prototyp für ein Objekt, und ein Objekt sollte den Namen einer Sache haben, und nicht den einer Fähigkeit. Einfacher gesagt: Du würdest ja auch kein Objekt Fahren haben wollen, sondern ein Objekt Auto mit der Fähigkeit (Methode) "fahren", deshalb solltest Du die Klasse anders bennenen.
Sehr gute Idee! Ist schon umgesetzt. Macht auch Sinn, wie ich merke, denn die Klasse wird jetzt erweitert und wird später noch mehr Sachen können als nur ein File lesen (reinschreiben z.B. :wink:).
Antworten