[PYTHON] Über das Besuchermuster

Einführung

Ich hatte die Gelegenheit, das Besuchermuster in meine Arbeit zu implementieren, und ich habe es nicht klar verstanden. Dies ist eine Zusammenfassung dessen, was ich aus den folgenden Büchern gelernt habe.

Überblick

Das Besuchermuster kann Datenstruktur und Verarbeitung trennen.

Das Besuchermuster ist in eine Klasse unterteilt, die Daten enthält, und eine Klasse, die den Algorithmus implementiert (Besucherklasse).

Wenn Ihre Anwendung eine Datenstruktur enthält und einige Algorithmen auf diese Datenstruktur zugreifen

Das Besuchermuster ermöglicht es der Datenstruktur, sich auf das Speichern und Zugreifen auf Daten zu konzentrieren.

Sie können die Funktionalität erweitern, ohne die vorhandene Klasse zu ändern. (Prinzip offen / geschlossen)

Hintergrund

Viele Elemente sind in der Datenstruktur gespeichert, und ich möchte für jedes Element eine Verarbeitung durchführen.

Wo soll ich zu diesem Zeitpunkt den "Verarbeitungs" -Code schreiben? Wenn Sie in eine Klasse schreiben, die die Datenstruktur darstellt ** Die Datenstrukturklasse muss jedes Mal geändert werden, wenn eine neue Verarbeitung erforderlich ist. ** ** **

Das Besuchermuster hat sich bei der Lösung der oben genannten Probleme als nützlich erwiesen.

Charakteristisch

Gemäß Einführung in in Java-Sprache erlernte Entwurfsmuster sind die folgenden Beziehungen zwischen Datenstrukturklassen und Algorithmen zugeordnet, die Algorithmen beschreiben. es gibt.

Die Klasse, die die Datenstruktur enthält, sei die Klasse "Visitable", und die Klasse, die den Algorithmus für die Datenstruktur beschreibt, sei die Klasse "Visitor".

Definieren Sie die Methode "visit (visitable)" in der Klasse "Visitor". Schreiben Sie in visit () den Algorithmus, während Sie auf die Attribute und das Verhalten der Klasse der Datenstruktur zugreifen.

Andererseits definiert die Klasse "Visitable" die Methode "accept (Besucher)". Rufen Sie innerhalb von "Akzeptieren (Besucher)" "Besuchen ()" des im ** Argument übergebenen Besucherobjekts auf. ** ** **

Beispielcode

Beschreibt eine Datenstrukturklasse (Visitable-Klasse). Beschreibt eine Klasse, die Daten vom Listentyp enthält, und eine Klasse, die Daten vom Typ Wörterbuch enthält. Definieren Sie eine Methode (accept ()), die die Visitor-Klasse in jeder Klasse akzeptiert.

visitable.py


class VisitableList(list):

    def accept(self, visitor):
        visitor.visit_list(self)

class VisitableDict(dict):

    def accept(self, visitor):
        visitor.visit_dict(self)

Schreiben Sie als Nächstes die Visitor-Klasse, die den Algorithmus beschreibt. Im folgenden Code werden die Daten, die von der Klasse der oben beschriebenen Datenstruktur gehalten werden, einfach als Standard ausgegeben.

visitor.py


class Printer(object):
    def visit_list(self, instance):
        print('Der Inhalt der Liste: {}'.format(instance))

    def visit_dict(self, instance):
        print('Schlüssel im Wörterbuch: {}'.format(
            ', '.join(instance.keys())
        ))

Verwenden Sie dann die Datenstrukturklasse und die Besucherklasse, wie im folgenden Beispielcode gezeigt. Erstellen Sie ein Objekt der Klasse der Datenstruktur, Datenstrukturobjekt .accept (Besucherobjekt) Es wird beschrieben als.

main.py



def main():

    vistitable_list = VisitableList([1, 2, 3, 5])
    vistitable_list.accept(Printer())
    vistitable_dict = VisitableDict({'one': 1, 'two': 2, 'three': 3})
    vistitable_dict.accept(Printer())

if __name__ == "__main__":

    main()
$ python main.py
Der Inhalt der Liste: [1, 2, 3, 5]
Schlüssel im Wörterbuch: one, two, three

Verbinden Sie Besucher- und Besucherklassen mit den Merkmalen der Selbstbeobachtung

Selbstbeobachtung ist die Art und Abdeckung eines Objekts (in diesem Fall eines Objekts). Eine Funktion, die untersucht werden kann, um das Mögliche abzudecken.

Das Verweisen oder Abrufen von "welche Eigenschaften haben" für ein Objekt wird beispielsweise als Selbstbeobachtung bezeichnet.

Der folgende Code nutzt die Eigenschaften der Selbstbeobachtung und beschreibt eine Klasse, die die Besucherklasse und die Besucherklasse verbindet.

class Connect():
    def __init__(self, visited, vistor):
        self.__cls = visited.__class__.__name__
        self.__method_name = 'visit_%s' % self.__cls
        self.__method = getattr(vistor, self.__method_name, None)
        
        # visit()Implementiert
        self.__method(visited)

vistied .__ class .___ name__ undgetattr ()sind Introspektionen.

Implementieren Sie es im folgenden Code mit der zuvor beschriebenen Druckerklasse.

main.py


if __name__ == "__main__":

    Connect([1, 2, 3], Printer())
$ python main.py
Der Inhalt der Liste: [1, 2, 3]
Schlüssel im Wörterbuch: one, two, three

Introspection macht die Implementierung von accept () in der Visitor-Klasse überflüssig.

Impressionen

In Einführung in in Java-Sprache erlernte Entwurfsmuster als Grundform, Definieren Sie die Methode "accept ()" in der Datenstrukturklasse und die Methode "visit ()" in der Klasse, die den Algorithmus implementiert. Dann rufen wir innerhalb der definierten Methode die Methoden des anderen auf. (Eine Technik namens Doppelversand)

In Expert Python Programming Revised 2nd Edition sind die Attribute von Objekten in Python dynamisch Als Ergebnis wurde festgestellt, dass das Besuchermuster ohne Verwendung der accept () -Methode implementiert werden konnte.

In jedem Fall denke ich, dass es notwendig ist, die visit () -Methode in der Definitionsklasse (Visitor) mit ausreichender Kenntnis der Attribute und des Verhaltens der Klasse in der Datenstruktur zu implementieren.

Verweise

Recommended Posts

Über das Besuchermuster
Über den Test
Über die Warteschlange
Lernen Sie das Entwurfsmuster "Besucher" mit Python
Besuchermuster in Python
Informationen zur Entfaltungsfunktion
Über den Servicebefehl
Über die Verwirrungsmatrix
Über das Python-Modul venv
Über die Aufzählungsfunktion (Python)
Über das Problem der reisenden Verkäufer
Über das Verständnis des 3-Punkt-Lesers [...]
Über die Komponenten von Luigi
Über die Funktionen von Python
Denken Sie an das Problem der minimalen Änderung
Ändere das Fliegengewichtsmuster in Pythonic (?) (2)
Über das bestellte Patrouillenverkäuferproblem
Über den Rückgabewert von pthread_mutex_init ()
Implementieren Sie das Singleton-Muster in Python
Über den Rückgabewert des Histogramms.
Über den Grundtyp von Go
Über die Obergrenze von Threads-max
Ändere das Fliegengewichtsmuster in Pythonic (?) (1)
Über die durchschnittliche Option von sklearn.metrics.f1_score
Über das Verhalten von Yield_per von SqlAlchemy
Über die Größe der Punkte in Matplotlib
Informationen zur Grundlagenliste der Python-Grundlagen
Denken Sie grob über die Verlustfunktion nach
Über die Angelegenheit, dass das re.compiled-Objekt für das re.match-Muster verwendet werden kann
Ich habe über Designmuster (persönliches Memo) Teil 5 (Verbundmuster, Dekorationsmuster, Besuchermuster) studiert.
Lernen Sie das Entwurfsmuster "Builder" mit Python
[Python Kivy] Über das Ändern des Designthemas
[Viererbande] Designmuster lernen --Besucher
Lernen Sie das Designmuster "Flyweight" in Python
Lernen Sie das Entwurfsmuster "Observer" in Python
Lernen Sie das Entwurfsmuster "Memento" mit Python
Lernen Sie das Entwurfsmuster "Proxy" in Python
Verschiedene Hinweise zum Django REST-Framework
GoF-Entwurfsmuster aus dem Problem 2. Struktur
[OpenCV] Über das von imread zurückgegebene Array
Über NumFOCUS, eine Open Source-Support-Organisation
Lernen Sie das Entwurfsmuster "Bridge" mit Python
Lernen Sie das Entwurfsmuster "Mediator" mit Python
Lernen Sie das Designmuster "Decorator" mit Python
Denken Sie grob über die Gradientenabstiegsmethode nach
[Python] Fassen Sie die rudimentären Dinge über Multithreading zusammen
Informationen zu der von Ihnen verwendeten Entwicklungsumgebung
Lernen Sie das Entwurfsmuster "Iterator" mit Python
Über die Beziehung zwischen Git und GitHub
Über die Normalgleichung der linearen Regression
Lernen Sie das Entwurfsmuster "Strategie" mit Python
Lernen Sie das Entwurfsmuster "Composite" mit Python
Lernen Sie das Entwurfsmuster "Singleton" mit Python
Lernen Sie das Entwurfsmuster "State" in Python
Lernen Sie das Entwurfsmuster "Adapter" mit Python
Lernen Sie das Designmuster "Facade" mit Python
GoF-Entwurfsmuster aus dem Problem 3. Verhalten
Ein Memo, dass ich das Pyramid Tutorial ausprobiert habe