Seite 1 von 1

Flag für einmaliges Ausführen

Verfasst: Donnerstag 17. September 2020, 08:54
von Lorenz112233
Hallo,

ich bin neu in Python und weiß nicht wie ich es schaffe das die if Anweisung nur einmal ausgeführt wird.
Zwar weiß ich das ich am Ende der if Anweisung eine Variable setzen könnte und diese oben abfragen könnte jedoch weiß ich nicht wie.

Ich hoffe mir kann jemand helfen.

Mfg

Lorenz

Code: Alles auswählen

import datetime
import time
RFID = 5
date = datetime.date.today()


while True:

    class mitarbeiter:

        def __init__(self, nummer, name):
            self.nummer = nummer
            self.name = name

            if RFID == self.nummer:

                file = open("Arbeitszeit" + date.strftime("%B") + self.name + ".txt", "a")
                day = datetime.date.today().day
                self.loginTime = time.strftime("%H:%M")
                file.write(str(day) + "/    " + self.loginTime)
                file.close()


    mitarbeiter1 = mitarbeiter(1, "Daniel")
    mitarbeiter2 = mitarbeiter(2, "Hans")
    

Re: Flag für einmaliges Ausführen

Verfasst: Donnerstag 17. September 2020, 09:52
von CoderGirl
Die Experten mögen mich korrigieren, aber ging es evt. über eine while mit true und dann ein break? Anstelle des IF?

Re: Flag für einmaliges Ausführen

Verfasst: Donnerstag 17. September 2020, 09:55
von sparrow
@Lorenz112233: Warum definierst du die Klasse denn in der Schleife? Da gehört die Klassendefinition nicht hin. Überhaupt sehe ich da gar keinen Grund für eine Schleife.

Re: Flag für einmaliges Ausführen

Verfasst: Donnerstag 17. September 2020, 10:05
von Lorenz112233
sparrow hat geschrieben: Donnerstag 17. September 2020, 09:55 @Lorenz112233: Warum definierst du die Klasse denn in der Schleife? Da gehört die Klassendefinition nicht hin. Überhaupt sehe ich da gar keinen Grund für eine Schleife.
Damit das Skript andauernd läuft oder ist das auch anders möglich?

Re: Flag für einmaliges Ausführen

Verfasst: Donnerstag 17. September 2020, 10:09
von Jankie
Du musst in der __init__ ein self.flag = False setzen, dann wird in der IF Bedingung noch geprüft ob das self.flag False ist, wenn ja, dann wird der Code ausgeführt und am Ende davon wird self.flag auf True gesetzt.

kleines Beispiel:

Code: Alles auswählen

class Mitarbeiter:
    def __init__(self, nummer, name):
        self.nummer = nummer
        self.name = name
        self.flag = False

        if RFID == self.nummer and not self.flag:
            with open(f"Arbeitszeit{date.strftime("%B")}{self.name}.txt", "a") as file:
                day = datetime.date.today().day
                self.login_time = time.strftime("%H:%M")
                file.write(f"{day}/    {self.login_time}")
            self.flag = True

Re: Flag für einmaliges Ausführen

Verfasst: Donnerstag 17. September 2020, 10:10
von sparrow
@Lorenz112233: Du willst, dass dein Script ständig eine Klasse definiert, 2 Instanzen davon erzeugt und dann wieder von vorne anfängt? Das macht keinen Sinn.

@Jankie: Dein flag ist einmal an self gebunden und einmal nicht. Und warum sollte __init__ überhaupt öfter als 1 Mal ausgeführt werden?!?

Re: Flag für einmaliges Ausführen

Verfasst: Donnerstag 17. September 2020, 10:12
von Jankie
@sparrow Gerade selbst gemerkt, habe es korrigiert, danke.

Die __init__ wird nur genau einmal ausgeführt und zwar beim erstellen des Objektes, also ist ein Flag da sinnlos, stimmt.

Re: Flag für einmaliges Ausführen

Verfasst: Donnerstag 17. September 2020, 10:19
von Lorenz112233
@sparrow: Nein das will ich eigentlich nicht, ich will nur das andauernd verglichen wird ob ein RFID Tag vorhanden ist und wenn dann die if Anweisung einmal ausgeführt wird.

Re: Flag für einmaliges Ausführen

Verfasst: Donnerstag 17. September 2020, 10:22
von Jankie
@Lorenz112233: Die if Anweisung wird so oder so nur einmal geprüft, da diese in der __init__ steht. Die __init__ wird nur ein mal ausgeführt für jedes erstelle Objekt (wird beim erstellen ausgeführt, also an der Stelle wo du mitarbeiter1 = mitarbeiter(1, "Daniel") ausführst)

Re: Flag für einmaliges Ausführen

Verfasst: Donnerstag 17. September 2020, 10:34
von Sirius3
@Lorenz112233: so wie Du die Klasse geschrieben hast, ist es falsch. Du willst einen Mitarbeiter definieren, der eine Methode registriere Arbeitszeit hat und zwar immer dann, wenn von irgendwoher eine RFID kommt.
Klassen werden mit Großem Anfangsbuchstaben geschrieben. Strings stückelt man nicht mit + zusammen, sondern nutzt Formatstrings. Dateien öffnet man innerhalb von with. date, day und time werden unabhängig voneinander bestimmt, da kann es also Fehler von bis zu einem Jahr geben. Zeilen werden mit einem Zeileendezeichen abgeschlossen.

Code: Alles auswählen

import datetime

class Mitarbeiter:
    def __init__(self, nummer, name):
        self.nummer = nummer
        self.name = name
        
    def registrieren(self):
        now = datetime.datetime.now()
        with open(f"Arbeitszeit{now:%B}{self.name}.txt", "a") as output:
            output.write(f"{now:%d/%H:%M}\n")


def main():
    mitarbeiter = {
        1: Mitarbeiter(1, "Daniel"),
        2: Mitarbeiter(2, "Hans")
    }
    while True:
        rfid = lese_von_irgendwoher_die_rfid()
        mitarbeiter[rfid].registrieren()

if __name__ == '__main__':
    main()

Re: Flag für einmaliges Ausführen

Verfasst: Donnerstag 17. September 2020, 10:48
von Lorenz112233
Vielen Dank, ihr habt mir sehr viel weiter geholfen