Methoden einer Klasse importieren und aufrufen

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
jve
User
Beiträge: 6
Registriert: Montag 17. August 2020, 14:52

Hallo,

ich habe eine Klasse Functions geschrieben und möchte diese jetzt in einer .py Datei importieren und ihre methoden aufrufen.

import os
from functions import Functions
f = Functions()

Ich bekomme aber eine Fehlermeldung : no value for argument 'path' in constructor call
ich verstehe nicht warum, vielleicht kann mir jemand einen Tipp geben :D

Danke!
Hier die Klasse Functions

Code: Alles auswählen


class Functions():
    
    def __init__(self, path):
        self.path = path
        self.num_Dir = 0
        self.num_Files = 0
        self.liste_verzeichnisse_dateien = []
        self.path_is_valid = False

    def get_path(self):
        return self.path
        
    def check_path(self):
        self.path_is_valid = os.path.isdir(self.path)
        return self.path_is_valid

    def name_dir_file(self):
        if self.path_is_valid:
            for root, dirs, files in os.walk(self.path):
                filemode = stat.filemode(os.stat(root).st_mode)
                self.liste_verzeichnisse_dateien.append(filemode + '\t' + root)
                self.num_Dir += 1
                for Files in files:
                    if os.path.exists(root + '\\' + Files):
                        filemode = stat.filemode(os.stat(root + '\\' + Files).st_mode)
                        self.liste_verzeichnisse_dateien.append(filemode + '\t' + root + '\\' + Files)
                        self.num_Files += 1
                        
        return self.liste_verzeichnisse_dateien, self.num_Dir, self.num_Files
Benutzeravatar
sparrow
User
Beiträge: 4538
Registriert: Freitag 17. April 2009, 10:28

Das hat nichts mit dem Importieren zu tun, sondern du vergisst Argumente, die die Klasse zur Initialisierung braucht.

Dann schau doch mal, wofür die __init__ Methode da ist und was die für Argumente erwartet.
Die Fehlermeldung ist ja sehr deutlich.
Sirius3
User
Beiträge: 18272
Registriert: Sonntag 21. Oktober 2012, 17:20

`Functions` ist ein schlechter Name für eine Klasse. Klassen fassen ja Daten zusammen, und Funktionen sind keine Daten. Attribute schreibt man wie Variablennamen und Funktionen komplett klein, benutze auch keine Abkürzungen: num_Dir -> number_of_directories.
Triviale Getter schreibt man in Python nicht, das get_path kann also weg, weil man auch direkt auf xyz.path zugreifen kann.
`check_path` ist eine seltsame Methode, weil sie ein Attribut path_is_valid setzt, das im Fall, dass check_path nicht aufgerufen wird, einen falschen Wert enthält. In name_dir_file wird aber genau dieses path_is_valid benutzt. Das ist eine potentielle Fehlerquelle. Daher wirf das path_is_valid komplett weg und benutz immer check_path.
`name_dir_file` ist auch seltsam, weil aus dem Funktionsnamen nicht wirklich klar wird, was die Funktion macht. Der Rückgabewert besteht nur aus Attributen, das heißt, die Rückgabewerte sind eigentlich überflüssig, weil man an die Information auch über die Klasse kommt, oder die Attribute sind überflüssig, weil sie nur durch einen Funktionsaufruf sinnvollen Inhalt haben. Ich bin ja für zweiteres.
Damit hat die Klasse bis auf path keine Attribute mehr und im wesentlichen nur eine Methode. Damit handelt es sich gar nicht mehr um eine richtige Klasse (die ja auch noch keinen richtigen Namen hat) sondern nur um eine einfache Funktion.
Beim Lernen, wie man Klassen benutzt, sollte man auch immer lernen, wann man Klassen benutzt, und hier ist das ein Fall, in dem Klassen keinen Sinn ergeben. Ebensowenig wie das ganze Modul Sinn ergibt, solange es keinen besseren Namen als functions hat.

Nun zur eigentlichen Funktion: die Methoden aus os und os.path werden hier schon durch pathlib.Path abgedeckt, was verständlicher ist, und darum auch zu benutzen. Das habe ich aber alles schon in Deinem anderen Thread geschrieben, darum lies das dort nochmal nach und setze es auch um.
Antworten