Bereits geschriebenes Skript objektorientiert schreiben

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
ste8899
User
Beiträge: 3
Registriert: Dienstag 22. Mai 2018, 07:18

Guten Morgen liebe Python-Freunde,

ich bin relativ neu in diesem Themengebiet und brauche Hilfe.

Ich habe vor kurzem ein Programm geschrieben das nach bestimmten Dateitypen (*.prt) in selbst gewählten Laufwerken suchen soll und diese dann anschließend löschen soll. Nun wird von mir verlangt dieses objektorientiert zuschreiben, damit hinterher eine Benutzeroberfläche benutzt werden kann (Kivy). Ich weiß aber überhaupt nicht wie ich das ganze angehen soll...Eine Idee wäre es zwei Objekte zu erstellen: Search und Delete. Aber wie bereits gesagt weiß ich nicht wie ich das ganze angehen soll und vielleicht habt ihr einen bessere Idee. Wäre jemand bereit mir das zu erklären oder noch besser zu schreiben? Unten findet ihr das Hauptprogramm und noch das verbundene Modul!


Hauptprogramm

Code: Alles auswählen

import sys,os, win32api
from datetime import datetime, timedelta
import SearchFiles

# Laufwerke wählen.
list = win32api. GetLogicalDriveStrings()
ListeMitLaufwerken = list.split('\000') [:-1]

for i in range(sys.maxsize):
    print("Bitte Laufwerks-Buchstaben eigeben")
    eingabe = input()+":\\"
    if eingabe in ListeMitLaufwerken:
        break
    else:
        print("Laufwerk nicht gefunden!")

driveslist = [eingabe]
print("Folgende Laufwerke werden gescannt:", driveslist)

# Durch neue Funktion ersetzen und für jeden Laufwerksbuchstaben ausführen.
dateiengesamt = []
for elem in driveslist:
    dateiengesamt += SearchFiles.searchfiles(elem)

print(dateiengesamt)

# Anzahl aller gefundenen Dateien.
if (len(dateiengesamt)) == 0:
    print("\nEs wurden keine Protokolle gefunden")
    sys.exit()
else:
    print("Die Anzahl der gefundenen Protokolle liegt bei:", (len(dateiengesamt)))

# Ausgabe wirklich löschen?
print("\nSollen alle Protokolle die älter als 2 Monate sind, gelöscht werden?(0 = nein und 1 = ja)")
loeschen = input()

#Antwort ob gelöscht werden soll.
if loeschen == "1":
    # Datei entfernen
    for elem in dateiengesamt:

        file_mtime = datetime.fromtimestamp(os.path.getmtime(elem))
        max_mtime = datetime.now() - timedelta(seconds=10)              #zum Testen auf 10 Sekunden eingestellt

        if file_mtime < max_mtime:
            print("Alle Protokolle die älter als 2 Monate sind, wurden entfernt")
            try:
                os.remove(elem)

            except:
                print("Fehler beim löschen der Protokolle")
                sys.exit()
        else:
            print("Protokolle sind nicht älter als 2 Monate!")
else:
    print("Sie haben den Vorgang abgebrochen")
    sys.exit()
Searchfiles

Code: Alles auswählen

from pathlib import Path
import os

def searchfiles(laufwerk):
    suffixes = []
    returnfile = []
    print("Folgende Datein wurden gefunden:")

    for root, dirs, files in os.walk(laufwerk):  # root = Path, dirs = folders, files = files
        for file in Path(str(root)).iterdir():
            if file.suffix == '.prt':  # oder -> file.stem == 'filename'
                returnfile.append(file)


    return returnfile
Danke im Vorraus

Gruß :D
Benutzeravatar
kbr
User
Beiträge: 1487
Registriert: Mittwoch 15. Oktober 2008, 09:27

Wenn eine GUI etwas tut, dann macht sie dies durch Funktionsaufrufe. Objektorientierung kann dabei hilfreich sein, ist aber nicht notwendigerweise erforderlich. Du musst jedoch Dein Programm zumindest so in Funktionen aufgliedern, so dass sich auf Modulebene kein ausführbarer Code mehr befindet und ein klar definierter Einsprungpunkt vorliegt.
Sirius3
User
Beiträge: 17738
Registriert: Sonntag 21. Oktober 2012, 17:20

Wenn jemand das Skript in einem Programm verwenden will, dann muß alles in Funktionen stehen, und kein ausführbarer Code auf oberster Ebene. Solche Sachen wie `input` sind verboten, denn der Input wird den Funktionen über Parameter übergeben. Alles was mit `print` ausgegeben wird, muß entweder als Rückgabewert übergeben werden, oder über einen Logging-Mechanismus ausgegeben werden.

sys.exit darf immer noch nicht vorkommen. Aber Du hast auch alle meine sonstigen Anmerkungen aus Deinem anderen Thread geflissentlich ignoriert, der Quatsch mit der unsinnigen zweiten for-Schleife in searchfiles ist also noch da. Das Modul SearchFiles (das übrigens komplett kein geschrieben sein sollte) ist eigentlich überflüssig, da eine so kurze Funktion kein eigenes Modul braucht.

Sonstige Anmerkungen:
Zeile 1: pro Zeile nur ein Modul importieren
Zeile 6: `list` nicht als Variablennamen verwenden, da es ein eingebauter Typ ist.
Zeile 7: Variablennamen werden generell klein_mit_unterstrich geschrieben.
Zeile 9: Du willst eine Endlosschleife (while True:)
Zeile 17: Eine Liste mit nur einem Eintrag ist eigentlich überflüssig, aber vielleicht willst Du diese Variable ja als Liste Deiner zukünftigen search-Funktion haben
Zeile 23: Listen erweitert man mit `expand`
Zeile 28: kurz `if dateiengesamt:`
Zeile 30: weg damit, besser in Funktionen gliedern und `return` verwenden
Zeile 44: vor die for-Schleife
Zeile 51: keine nackten Excepts, Exception konkret angeben
Zeile 53/58: s.o.
Antworten