[PYTHON] Implementieren Sie ein Modell mit Status und Verhalten (3) - Beispiel für die Implementierung durch den Dekorateur

Beim letzten Mal (Implementieren eines Modells mit Status und Verhalten (2)) haben wir "StopWatch" mit drei Status auf zwei Arten implementiert. .. Dieses Mal wird "StopWatch" mit * decorator * implementiert.

Beschreiben Sie zunächst den Zustandsübergang mit * decorator *. Es ist leichter zu verstehen, ob es sich um eine Zustandsübergangsmethode handelt.

from enum import auto


def transit(state):
    def decorator(func):
        def inner(self, *args, **kwargs):
            self.start_stop, self.reset = self._TRANSIT[state]
            func(self, *args, **kwargs)
        return inner
    return decorator


class StopWatch:
    WAIT, PAUSE, MEASURE = auto(), auto(), auto()

    def __init__(self):
        self._TRANSIT = {StopWatch.WAIT: (self.start, lambda *args: None),
                         StopWatch.PAUSE: (self.start, self.reset_time),
                         StopWatch.MEASURE: (self.pause, lambda *args: None)}
        self._TRANSIT_REVERSED = {v: k for k, v in self._TRANSIT.items()}
        self.start_stop, self.reset = self._TRANSIT[StopWatch.WAIT]

    @property
    def state(self):
        return self._TRANSIT_REVERSED[self.start_stop, self.reset]

    @transit(MEASURE)
    def start(self):
        pass

    @transit(PAUSE)
    def pause(self):
        pass

    @transit(WAIT)
    def reset_time(self):
        pass

Versuchen Sie außerdem, die Zustandsübergangstabelle mit einem Dekorateur auszuschneiden. Der "Verhaltens" -Dekorator repräsentiert das Verhalten in einem bestimmten Zustand.

from enum import auto
from state_machine import behavior, transit


class StopWatch:
    WAIT, MEASURE, PAUSE = auto(), auto(), auto()

    def __init__(self):
        self.state = StopWatch.WAIT

    @behavior(WAIT, "start")
    @behavior(MEASURE, "pause")
    @behavior(PAUSE, "start")
    def start_stop(self):
        pass

    @behavior(PAUSE, "reset_time")
    def reset(self):
        pass

    @transit(MEASURE)
    def start(self):
        pass

    @transit(PAUSE)
    def pause(self):
        pass

    @transit(WAIT)
    def reset_time(self):
        pass

state_machine.py


from functools import wraps


def transit(state):
    def decorator(func):
        @wraps(func)
        def inner(self, *args, **kwargs):
            self.state = state
            func(self, *args, **kwargs)
        return inner
    return decorator


def behavior(state, function):
    def decorator(func):
        @wraps(func)
        def inner(self, *args, **kwargs):
            if self.state == state:
                getattr(self, function)(*args, **kwargs)
            else:
                func(self, *args, **kwargs)
        return inner
    return decorator

Obwohl davon ausgegangen wird, dass der Status in self.state beibehalten wird, kann derselbe * Dekorator * in anderen Modellen verwendet werden, sodass er als Modul state_machine ausgeschnitten wurde.

Zum Zeitpunkt der Verarbeitung des Dekorateurs ist die Funktion noch nicht gebunden, sodass das Verhalten als Zeichenfolge angegeben wird. Sie können auch die Funktion __name__ verwenden, um zur Laufzeit eine gebundene Methode aufzurufen. (Nur zutreffende Teile sind unten gezeigt.) Beachten Sie, dass ein * Dekorateur , der functools.wrap () nicht verwendet, nicht wie erwartet funktioniert. ( Decorator * schreibt die Funktion __name__ bei Verwendung von functools.wrap () nicht neu.)

state_machine.py


def behavior(state, function):
...
            if self.state == state:
                getattr(self, function.__name__)(*args, **kwargs)
...
...
    @behavior(PAUSE, reset_time)
    def reset(self):
        pass
...

Recommended Posts

Implementieren Sie ein Modell mit Status und Verhalten (3) - Beispiel für die Implementierung durch den Dekorateur
Implementieren Sie ein Modell mit Status und Verhalten
Implementieren Sie mit OpenModelica das mathematische Modell "SIR-Modell" von Infektionskrankheiten (Beispiel für wiederholte Regulierung und Entspannung)
Machen wir eine nervenschwächende App mit Vue.js und Django-Rest-Framework [Teil 3] ~ Implementierung von Nervenschwäche ~
Übertragungsfunktion / Zustandsraummodell der RLC-Serienschaltung und Simulation von Python
TRIE-Baumimplementierung mit Python und LOUDS
Implementierung eines Modells, das Wechselkurse (Dollar-Yen-Kurs) durch maschinelles Lernen vorhersagt
Implementieren Sie mit stan ein zeitdiskretes logistisches Regressionsmodell
Beispiel für das Lesen und Schreiben von CSV mit Python
Übertragungsfunktion / Zustandsraummodell des Feder- / Masse- / Dämpfersystems und Simulation von Python
Ich habe versucht, "Grundlagen der Zeitreihenanalyse und des Zustandsraummodells" (Hayamoto) mit Pystan zu implementieren
[Python] Implementierung von Clustering mit einem gemischten Gaußschen Modell
[# 2] Mach Minecraft mit Python. ~ Modellzeichnung und Player-Implementierung ~
Erstellen Sie einen Stapel von Bildern und blasen Sie sie mit ImageDataGenerator auf
Erstellen Sie mit PyQt5 und PyQtGraph einen 3D-Modell-Viewer
Modellbildung, Lernen und Denken lernen
Memorandum zum Speichern und Laden des Modells
Regressionsmodell mit Scikit-Learn und dessen Visualisierung
Laden und Testen des von Chainer trainierten Imagenet-Modells
Implementieren Sie ein Modell mit Status und Verhalten
Mit Dekorateur dekorieren
Eine Geschichte über das Lesen eines Bilderbuchs durch Synthetisieren von Sprache mit COTOHA API und Cloud Vision API
Implementierungsbeispiel für die zentrale Verwaltung von Inventar und Variablen durch Verknüpfung von Ansible und Serverspezifikation (unterstützt mehrere Server)
Implementierung von VGG16 mit Keras, die ohne Verwendung eines trainierten Modells erstellt wurden
Speichern Sie die Ausgabe von GAN nacheinander ~ Mit der Implementierung von GAN durch PyTorch ~
Implementieren Sie mit Open Modelica das mathematische Modell "SIR-Modell" von Infektionskrankheiten
Erkennen Sie mit Python Objekte einer bestimmten Farbe und Größe
Analysieren Sie das Themenmodell, mit GensimPy3 Romanautor zu werden
Erläuterung der CSV und Implementierungsbeispiel in jeder Programmiersprache
Zeitreihenanalyse durch allgemeines Gaußsches Zustandsraummodell unter Verwendung von Python [Implementierungsbeispiel unter Berücksichtigung von Extrinsik und Saisonalität]
Eine Geschichte und ihre Implementierung, dass beliebige a1 * a2-Daten durch ein dreischichtiges neuronales ReLU-Netzwerk mit a1- und a2-Zwischenneuronen ohne Fehler dargestellt werden können.
Erklärung und Implementierung von SocialFoceModel
Einfach cProfile mit einem Dekorateur
Umgebungskonstruktion von Tensorflow und Chainer durch Fenster mit CUDA (mit GPU)
Miyashitas Beispiel für analytische Mechanik löste Übungen und bewegte sich mit Animation
Crawlen mit Python und Twitter API 2-Implementierung der Benutzersuchfunktion
[Erforderliches Thema DI] Implementieren und verstehen Sie den Mechanismus von DI mit Go
[Python] Implementierung der Nelder-Mead-Methode und Speichern von GIF-Bildern durch matplotlib
Versuchen Sie, eine Blackjack-Strategie zu entwickeln, indem Sie das Lernen stärken ((1) Implementierung von Blackjack)
Implementierungsbeispiel für das Hostile Generation Network (GAN) von Keras [Für Anfänger]
Definieren Sie einen benutzerdefinierten Argumenttyp mit einem Klick (Beispiel: Implementierung eines Typs, der eine Bewertungszeichenfolge zu einem optionalen Wert macht)
Erstellen einer verteilten Umgebung mit der Raspberry PI-Serie (Teil 1: Zusammenfassung der Verfügbarkeit von plattenlosen Clients nach Modell)