Ein Java-Programmierer studierte Python. (Über Dekorateure)

Ich bin ein Java-Programmierer, der mit viel Schwung angefangen hat, Python zu studieren, weil mir die Beiträge in Java ausgegangen sind.

Dieses Mal werde ich den Dekorateur studieren, den ich weggelassen habe, weil ich ihn das letzte Mal nicht verstehen konnte. Klicken Sie hier für frühere Studienartikel. Über if, for, while-Anweisungen Über Typ (Informationen zu Funktionen (Methoden)

Was ist ein Dekorateur?

In Samurai Engineer School wurde Folgendes geschrieben.

Ein Dekorator ist eine Funktion zum Hinzufügen oder Ändern der Verarbeitung zu einer vorhandenen Funktion.

Mit Dekorateuren können Sie vorhandenen Funktionen Funktionen hinzufügen oder ändern, ohne sie direkt zu ändern.

Wenn Sie beispielsweise eine Funktion haben und das Verhalten der Funktion durch Verarbeitung ändern möchten, können Sie sich die Mühe ersparen, für jede Verarbeitung eine ähnliche Funktion zu erstellen.

Ist es eine Überschreibung in Java? Das Überschreiben ist wie das Neudefinieren oder Neuerstellen einer Methode. Unterscheidet es sich also ein bisschen vom Hinzufügen oder Ändern?

Wie benutzt man?

Die grundlegende Syntax lautet

@Name des Dekorateurs

In Java wird @ wie eine Anmerkung verwendet. Ich habe mir einen Beispielcode angesehen, aber alle wurden in der Funktion (def) definiert.

Das Folgende ist eine Kopie des Beispielcodes von hier.

def decorateSample(myfunc):
    print("Hello Decorator")
 
@decorateSample
def myfunc():
    print("Test")

Als ich das tat, bekam ich die Ausgabe "Hello Decorator". "Test" wird übrigens nicht ausgegeben. Der Punkt ist, den Namen der Funktion festzulegen, die den Dekorator als Argument verwendet.

Pass bedeutet "nichts tun". Ist es ";" oder "return;" in Java?

Dies ist eine der Syntaxen, die als Syntaxzucker (Sugar Coating Syntax) bezeichnet wird. ~~ Es ist ein köstlicher Name. ~~ Ich war neu im Wort Syntax Zucker, also bin ich ein wenig abgewichen, aber ich habe es nachgeschlagen.

Was ist Syntaxzucker?

Es gab eine normale Seite in Wikipedia. Ich dachte, es wäre ein Python-spezifischer Syntaxname, aber das war es nicht.

Es kann einfacher und verständlicher geschrieben werden, was genau die gleiche Bedeutung hat wie eine komplizierte und schwer verständliche Schreibweise.

Es scheint, dass die Syntax abgekürzt ist. Wenn Sie es also in Java ausdrücken,

//Schreiben, das kein Syntaxzucker ist
String[] strs = new String[2];
strs[0] = "abc";
strs[1] = "def";
//Syntax Zucker schreiben
String[] strs = {"abc", "def"};

darüber. Die Tatsache, dass "Hello Decorator" ausgegeben wird, obwohl die Funktion nicht aufgerufen wird, wird als Syntaxzucker bezeichnet. Es ist mir peinlich, dass ich es nicht wusste ...

Was macht der Dekorateur intern?

Der oben erwähnte Python-Code ist schließlich

def decorateSample(myfunc):
    print("Hello Decorator")
 
def myfunc():
    print("Test")

myfunc = decorateSample(myfunc)

Scheint zu tun.

myfunc = decorateSample(myfunc)

Was machst du hier? ?? Weisen Sie myfunc? Den Inhalt der Funktion decorateSample zu. Ersatz? Hast du das Gefühl, dass du es tust? Bedeutet das also, dass "Test" nicht ausgegeben wird und "Hello Decorator" ausgegeben wird? ~~ Ich war frustriert über mein Unverständnis ~~

Python Standarddekorateur

Python wird mit Standarddekoratoren geliefert. Es scheint, dass es drei Arten von üblichen Dekorateuren gibt, die häufig verwendet werden.

Schauen wir uns jeden an.

classmethod

Ich habe dies als Referenz verwendet (http://st-hakky.hatenablog.com/entry/2017/11/15/155523).

Eine Klassenmethode ist eine innerhalb einer Klasse definierte Methode, die ohne Instanziierung aufgerufen werden kann. Dies wird verwendet, wenn eine Methode definiert wird, die etwas mit der Klasse selbst und nicht mit der Instanz tut.

Mmm ... Bevor ich es nachgeschlagen habe, dachte ich "Java-Instanzmethode" = "Python-Klassenmethode", aber es scheint anders zu sein.

Die übliche Methode zum Schreiben einer Methode in Python ist das folgende Bild (Instanzmethode in Java?)

class SampleClass:
    def hello_world(self):
        print("Hello World!")

#Methode instanziieren und aufrufen
sample_class = SampleClass()
sample_class.hello_world()

Was ist selbst! Es scheint jedoch, dass es "dies" in Java bedeutet.

Jetzt können Sie @classmethod verwenden, um es aufzurufen, ohne es wie oben instanziieren zu müssen.

class SampleClass:
    
    @classmethod
    def hello_world(cls):
        print("Hello World!")

#Rufen Sie die Methode so auf, wie sie ist
SampleClass.hello_world()

Es ist üblich, sich in cls zu ändern. Beachten Sie, dass sich der Name des ersten Arguments zwischen der normalen Methode und der Klassenmethode unterscheidet. (Da die Klassenmethode die Klasse als erstes Argument empfängt, scheint sie cls zu heißen ...)

Es scheint, dass eine Klassenmethode mit der Funktion classmethod () realisiert werden kann, dies wird jedoch nicht empfohlen. Also habe ich diesmal weggelassen.

staticmethod

Ähnlich wie bei classmethod, zitiert von dieser Site.

Kurz gesagt gibt es die folgenden Unterschiede. -Staticmethod: Dies funktioniert unabhängig von der Klasse, auch wenn es in der Klasse definiert ist, und berücksichtigt nur das empfangene Argument. Grob gesagt unterscheidet es sich nicht nur von einer Funktion. -Klassenmethode: Dies kann die Klasse selbst als Argument nehmen und mit dem empfangenen Argument verwenden

Die statische Methode scheint eine Methode zu sein, die keine Instanziierung erfordert und keine Argumente akzeptiert. "Das war's. Dann können Sie eine normale Funktion verwenden. Wann sollte ich sie verwenden?"

Anscheinend ist das Verhalten in der geerbten Klasse anders. Unten finden Sie einen weiteren Code, der den Beispielcode nachahmt.

class ParentClass():
    str = 'Hello, I am Parent Class'
 
    @classmethod
    def class_method(cls):
        print('class_method: ' + cls.str)
 
    @staticmethod
    def static_method():
        print('static_method: '+ ParentClass.str)

class ChildClass(ParentClass):
    str = 'Hello, I am Child Class'

ChildClass.class_method() #Ausführungsergebnis: Klasse_method: Hello, I am Child Class
ChildClass.static_method() #Ausführungsergebnis: statisch_method: Hello, I am Parent Class

Selbst wenn die untergeordnete Klasse static_method () aufruft, ruft sie dennoch die übergeordnete Klasse auf. Die Klassenmethode wechselt zum Referenzziel, wenn die Vererbung durchgeführt wird. Ich möchte staticmethod verwenden, wenn sich das Verhalten auch in untergeordneten Klassen nicht ändert. Es scheint, dass.

Java hat auch einen Namen namens statische Methode, aber es scheint, dass Sie vorsichtig sein müssen, da das Verhalten beim Erben anders ist.

property

Auch zitiert aus Referenzseite.

Python-Klassen können normalerweise direkt in Eigenschaften (Attribute) lesen und schreiben. Self wird als Argument für die init -Methode festgelegt, die beim Erstellen der Klasse ausgeführt wird, nicht wahr? Eine Eigenschaft ist eine Variable in Form von "self. ~". Mit @property wird die mit diesem Dekorator dekorierte Funktion zu einer lesbaren Eigenschaft namens getter. Nur lesen zu können bedeutet, dass Sie keine neuen Werte ändern können.

Was? (´ ・ ω ・ `)? Ich dachte, ich habe es ungefähr 5 Mal gelesen.

Ist es ein Dekorateur, der nur für Getter verwendet wird? Getter wird in Java aufgerufen

public String getter() {
  return this.hoge;
}

So ähnlich? e? Was ist dann mit dem Setterdekorateur?

Was ist die init Methode! Als ich es nachgeschlagen habe, war es ** Konstruktor **. Das war's.

Also, lass es uns noch einmal sehen,

class SampleClass(object):
    def __init__(self, hoge):
        self.__hoge = hoge
    
    @property
    def getter(self):
        return self.__hoge

#Methode instanziieren und aufrufen
sample_class = SampleClass(1234)
x = sample_class.getter

print(x) #Ausführungsergebnis: 1234

Der Setter, an dem ich interessiert war, war

class SampleClass(object):
    def __init__(self, hoge):
        self._hoge = hoge
    
    @property
    def hoge(self):
        return self._hoge
    
    @hoge.setter
    def hoge(self, hoge):
        self._hoge = hoge

#Methode instanziieren und aufrufen
sample_class = SampleClass(1234)
x = sample_class.hoge

print(x) #Ausführungsergebnis: 1234

sample_class.hoge = 5678
x = sample_class.hoge

print(x) #Ausführungsergebnis: 5678

Es ist wichtig, den Methodennamen mit dem mit @property abzugleichen, bei dem es sich um einen Getter handelt. (Ich habe das nicht verstanden und war ziemlich süchtig danach ...) Erstellen Sie es mit einem Namen wie @ propertytyname.setter.

Impressionen

Ich verstehe es als Konzept, aber ich weiß nicht, wie ich es gut verwenden soll. Ich denke, das liegt wahrscheinlich daran, dass ich das detaillierte Verhalten nicht verstehe.

Wenn es keine ähnliche Funktion wie Java gibt, mache ich mir Sorgen, dass mein Verständnis nachlässt. Ich hatte nicht viel Probleme mit PHP und C #, also bin ich ein wenig enttäuscht ... oder eher frustriert ...

Ich mache eine technische IT-Buchmesse bei Amazon, also kaufe ich mir ein gutes Python-Buch. Im Moment frage ich mich, ob es leicht zu lesen ist, ob es sich um eine WEB-Anwendung oder eine Spielprogrammierung handelt.

"Hör auf!" "Ich brauche kein Buch! Die Website ist genug!" Wenn Sie eine Meinung wie "Wenn Sie ein Anfänger sind, ist dies definitiv dieses Buch!" Haben, würde ich es begrüßen, wenn Sie mich wissen lassen könnten.

Referenzseite

https://www.sejuku.net/blog/25130 http://st-hakky.hatenablog.com/entry/2017/11/15/155523 https://kiwamiden.com/how-to-use-property-decorator http://nametake-1009.hatenablog.com/entry/2015/10/21/222829

Recommended Posts

Ein Java-Programmierer studierte Python. (Über Dekorateure)
Ein Java-Programmierer studierte Python. (Über Typ)
Ein Java-Programmierer studierte Python. (Über Funktionen (Methoden))
Ein Java-Programmierer studierte Python. (für, if, while-Anweisung)
[Python] Was ist @? (Über Dekorateure)
Denken Sie also an die Protokollierung
Ein Java-Programmierer studierte Python. (Über Typ)
Schreiben Sie eine Notiz über die Python-Version von Python Virtualenv
Ein Memorandum über die Python-Tesseract-Wrapper-Bibliothek
Python zeigt aus der Perspektive eines C-Sprachprogrammierers
Ein Memorandum über die Umsetzung von Empfehlungen in Python
Über das Python-Modul venv
Über die Aufzählungsfunktion (Python)
Memorandum über Korrelation [Python]
Ein Memorandum über den Python-Mock
Über die Funktionen von Python
Ein Hinweis zu [Python] __debug__
Ein Hinweis zum Aufrufen der Facebook-API mit dem Python SDK
Python: Ein Hinweis zu Klasse 1 "Abstract"
[Python] Machen Sie die Funktion zu einer Lambda-Funktion
Erstellen Sie ein universelles Dekorationsframework für Python
Informationen zur Grundlagenliste der Python-Grundlagen
Ein Hinweis zu Mock (Python-Mock-Bibliothek)
Ein bisschen mehr über Referenzen ~ Verwenden von Python und Java als Beispiele ~
[Python3] Definition eines Dekorators, der die Ausführungszeit einer Funktion misst
Nachdem ich die Python-Bibliothek recherchiert hatte, verstand ich ein wenig über ei.info.
Erstellen Sie mit Class einen Python-Funktionsdekorator
[Python Kivy] Über das Ändern des Designthemas
Schreiben Sie den Test in die Python-Dokumentzeichenfolge
Informationen zur virtuellen Umgebung von Python Version 3.7
Durchsuche das Labyrinth mit dem Python A * -Algorithmus
Lernen Sie das Designmuster "Decorator" mit Python
Führen Sie den Python-Interpreter im Skript aus
[Python] Fassen Sie die rudimentären Dinge über Multithreading zusammen
[Python] [Meta] Ist der Python-Typ ein Typ?
Eine Geschichte über Python Pop und Append
Die Geschichte der Verarbeitung A von Blackjack (Python)
[Python] Ein Fortschrittsbalken auf dem Terminal
[Python] Ein Programm, das die Partitur rundet
Über den 02. Februar 2020 * Dies ist ein Python-Artikel.
Ein Memo, dass ich das Pyramid Tutorial ausprobiert habe
[Python] Holen Sie sich die Dateien mit Python in den Ordner
Erstellt einen Python-Wrapper für die Qiita-API
Holen Sie sich den Aufrufer einer Funktion in Python
ffmpeg-Erstellen Sie eine Python-Umgebung und teilen Sie das Video
Ich habe eine Klasse in Python3 und Java geschrieben
Kopieren Sie die Liste in Python
Warum ich ein Java-Shop bin und Python starte
Über den Unterschied zwischen "==" und "is" in Python
Ein Memo, das ich in Python zusammengeführt habe
Python: Bereiten Sie einen Serializer für die Klasseninstanz vor:
Datenanalyse in Python: Ein Hinweis zu line_profiler
Eine Geschichte über das Ausführen von Python auf PHP auf Heroku
Denken Sie daran, eine Python 3-Umgebung in einer Mac-Umgebung zu erstellen
[Hinweis] Über die Rolle des Unterstrichs "_" in Python
[Python] Ein grobes Verständnis des Protokollierungsmoduls
Ausgabe in Form eines Python-Arrays
Ein Hinweis zur neuen Stilbasisklasse
Python Amateur versucht die Liste zusammenzufassen ②
[Python] Finden Sie die Translokationsmatrix in Einschlussnotation