Flag für einmaliges Ausführen

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
Lorenz112233
User
Beiträge: 4
Registriert: Donnerstag 17. September 2020, 08:41

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")
    
Benutzeravatar
CoderGirl
User
Beiträge: 74
Registriert: Samstag 22. April 2017, 17:47

Die Experten mögen mich korrigieren, aber ging es evt. über eine while mit true und dann ein break? Anstelle des IF?
Nur ein Mädchen, das nie so viel weiss, wie die Jungs :ugeek:
Benutzeravatar
sparrow
User
Beiträge: 4538
Registriert: Freitag 17. April 2009, 10:28

@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.
Lorenz112233
User
Beiträge: 4
Registriert: Donnerstag 17. September 2020, 08:41

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?
Jankie
User
Beiträge: 592
Registriert: Mittwoch 26. September 2018, 14:06

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
Zuletzt geändert von Jankie am Donnerstag 17. September 2020, 10:12, insgesamt 4-mal geändert.
Benutzeravatar
sparrow
User
Beiträge: 4538
Registriert: Freitag 17. April 2009, 10:28

@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?!?
Zuletzt geändert von sparrow am Donnerstag 17. September 2020, 10:14, insgesamt 1-mal geändert.
Jankie
User
Beiträge: 592
Registriert: Mittwoch 26. September 2018, 14:06

@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.
Lorenz112233
User
Beiträge: 4
Registriert: Donnerstag 17. September 2020, 08:41

@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.
Jankie
User
Beiträge: 592
Registriert: Mittwoch 26. September 2018, 14:06

@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)
Sirius3
User
Beiträge: 18272
Registriert: Sonntag 21. Oktober 2012, 17:20

@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()
Zuletzt geändert von Sirius3 am Donnerstag 17. September 2020, 10:52, insgesamt 1-mal geändert.
Lorenz112233
User
Beiträge: 4
Registriert: Donnerstag 17. September 2020, 08:41

Vielen Dank, ihr habt mir sehr viel weiter geholfen
Antworten