[PYTHON] Ein Hinweis zu __call__

Einführung

Sowohl Python als auch Keras sind Anfänger. Es ist ein Memorandum für mich.

Was ist diese Art zu schreiben

Mit der Keras-Funktions-API können Sie komplexere neuronale Netze als mit der Keras Sequential-API verwenden.

Hier kommt der folgende Schreibstil heraus.

001.py


import keras
from keras import layers

inputs = layers.Input(shape=(784,))
dense_hoge = layers.Dense(64, activation='relu')
x = dense_hoge(inputs)#Dies!

dens_hoge ist eine Instanz der Klasse keras.layers.core.Dense, aber auf den Instanznamen folgen Klammern und der Variablenname inputs wird darin geschrieben.

Darüber hinaus sind die letzten beiden Zeilen

002.py


x = layers.Dense(64, activation='relu')(inputs)

Sie können auch schreiben. Ich habe noch nie gesehen, wie Variablenname 1 (Variablenname 2) geschrieben wird.

Was zum Teufel macht das und wie?

Ergebnis der Untersuchung

Es wurde gesagt, dass die in der Klasse definierte Funktion \ _ \ _ call \ _ \ _ verarbeitet wird.

Schreiben wir eine einfache Klasse.

003.py


class A:
    def __init__(self):
        print("ClassA __init__")
    
    def __call__(self):
        print ("ClassA __call__")

Erstellen Sie ein Objekt der Klasse A und speichern Sie es in einem.

003.py


a = A()
#ClassA __init__

Versuchen Sie, die Instanz a mit () aufzurufen.

003.py


a()
#ClassA __call__

Daher habe ich festgestellt, dass das Hinzufügen von () zum Instanznamen den in \ _ \ _ call \ _ \ _ definierten Prozess ausführt.

Was ist mit Klassen, in denen \ _ \ _ call \ _ \ _ nicht definiert ist?

004.py


class B:
    def __init__(self):
        print("ClassB __init__")

b = B()
#ClassB __init__
b()  #Ich erhalte den folgenden Fehler
#Traceback (most recent call last):
#  File "<stdin>", line 1, in <module>
#TypeError: 'B' object is not callable

Das 'B'-Objekt wurde als nicht aufrufbar angezeigt. Es wird gesagt, dass callable () verwendet werden kann, um zu überprüfen, ob es aufrufbar ist, also habe ich es versucht.

004.py


callable(a)
#True
callable(b)
#False

Klasse B, die \ _ \ _call \ _ \ _ nicht definiert, ist jetzt False.

Die Angabe einer Klasse anstelle einer Instanz führte sowohl für Klasse A als auch für Klasse B zu true.

005.py


callable(A)
#True
callable(B)
#True

Können Sie sie kontinuierlich anrufen?

\ _ \ _ Call \ _ \ _ war, dass das Objekt der Rückgabewert sein könnte. Wenn also \ _ \ _ call \ _ \ _ ein aufrufbares Objekt zurückgibt, können wir dann den nächsten \ _ \ _ call \ _ \ _ nacheinander aufrufen? Die folgende Klasse C gibt eine Instanz der Klasse A zurück. Eine Instanz der Klasse A kann aufgerufen werden, und das Aufrufen von \ _ \ _ call \ _ \ _ sollte Klasse A \ _ \ _ call \ _ \ _ zurückgeben.

006.py


class C:
    def __init__(self):
        print("ClassC __init__")
    
    def __call__(self):
        print ("ClassC __call__")
        return A()

c = C()
c()()
#ClassC __call__   
#ClassA __init__    #der Klasse C.__call__Ausgabe, wenn Klasse A instanziiert wird
#ClassA __call__

.... ich konnte nacheinander anrufen. Ich denke nicht, dass es viel verwendet werden sollte, da der Code verwirrend sein wird, aber ich fand, dass es kontinuierlich funktioniert.

Was passiert, wenn ich einen vorhandenen Funktionsnamen als Variablennamen verwende?

Ich fand, dass ich den Variablennamen () schreiben konnte. In Python kann sogar die als Funktionsname verwendete Zeichenfolge als Variablenname verwendet werden. Der Variablenname lautet beispielsweise print. Wenn print () verwendet wird, heißt es \ _ \ _ call \ _ \ _? Oder ist es eine normale Druckfunktion?

007.py


print = A()
print('123') #Die folgende Fehleranzeige
#Traceback (most recent call last):
#  File "<stdin>", line 1, in <module>
#TypeError: __call__() takes 1 positional argument but 2 were given

\ _ \ _ Call \ _ \ _ wurde aufgerufen.

Erwägung

Ich fand, dass ich den Variablennamen () schreiben konnte.

Was ist der Unterschied zwischen dem Definieren und Verwenden von \ _ \ _ call \ _ \ _ in einer Klasse und dem Definieren und Verwenden der Funktion hoge ()? Was ist der Unterschied zwischen einem Variablennamen (Argument) und einem Variablennamen.hoge (Argument)?

Als Nachteil beim Schreiben von variable ()

  1. Bisher wurde entschieden, dass der Funktionsname vor den Klammern steht, dies ist jedoch nicht immer der Fall. Reduziert die Lesbarkeit des Codes.
  2. Wenn Sie unwissentlich denselben Variablennamen wie einen vorhandenen Funktionsnamen verwenden, kann diese Funktion nicht verwendet werden.

Es gibt zwei mögliche Punkte. Gibt es einen Vorteil bei der Verwendung von \ _ \ _ call \ _ \ _?

Methoden wie \ _ \ _ call \ _ \ _ scheinen spezielle Methoden zu sein. Es scheint, dass es auf verschiedene Arten verwendet werden kann, aber es scheint, dass es viele Erklärungsseiten gibt, deshalb möchte ich hier enden.

Recommended Posts

Ein Hinweis zu __call__
Ein Hinweis zum Unterprozess
Ein Hinweis zu mprotect (2)
Ein Hinweis zu KornShell (ksh)
Ein Hinweis zur TensorFlow-Einführung
Ein Hinweis zu [Python] __debug__
Hinweis zu get_scorer von sklearn
Ein Hinweis zu Mock (Python-Mock-Bibliothek)
Hinweis zu awk
Nur eine Notiz
Ein Memo, dass ich das Pyramid Tutorial ausprobiert habe
Hinweis zu Zeigern (Go)
Ein Memorandum über Nan.
Schreiben Sie eine Notiz über die Python-Version von Python Virtualenv
Datenanalyse in Python: Ein Hinweis zu line_profiler
Ein Hinweis zur neuen Stilbasisklasse
Modifikatoren zur Überprüfung von Memos mit MaxPlus
So rufen Sie eine Funktion auf
Was ist ein Systemaufruf?
Ein Memorandum über den Python-Mock
Ein bisschen mehr über FIFO
Eine kleine Notiz, die auf printf folgt
Ein Hinweis zum Aufrufen der Facebook-API mit dem Python SDK
Memo
Eine erfrischende Geschichte über Slice in Python
Notizen, wenn gcloud kaputt ist
Eine launische Geschichte über Slice in Python
Ich habe eine Frage zu Leerzeichen
Memo
Eine kleine Beispielnotiz von list_head
a () und a .__ call__ () sind nicht gleichwertig
Ein Hinweis zum Verbinden von Spark mit OpenStack Swift-basiertem IBM Object Storage
Python - Dynamische Aufruffunktion von String
Hinweise zum Schreiben von Python-ähnlichem Code
Eine Notiz, die numpy.array schön druckt
Die Geschichte der Verwendung von Python reduziert
[Übersetzung] Ein Memo über strukturierte Parallelverarbeitung. Oder besser gesagt, die go-Anweisung scheint schädlich zu sein
Ein Hinweis zu den Funktionen der Standard-Linux-Bibliothek, die sich mit Zeit befasst
Eine Notiz, in der ein Python-Anfänger stecken blieb
[Hinweis] Lesen Sie eine Datei aus einem anderen Verzeichnis
Eine Geschichte über einen magischen Umbau, der Lubuntu in ein Chromebook bringt
Ich berührte "Orator" und machte mir eine Notiz
Ein Java-Programmierer studierte Python. (Über Typ)
Memorandum zu Djangos QueryDict
Hinweise zum Aktivieren von PostgreSQL mit Django
Eine Geschichte über Python Pop und Append
Memo über Sphinx Teil 1 (Erstellen eines Projekts)
Aufrufbefehle von Python (Windows Edition)
Über den 02. Februar 2020 * Dies ist ein Python-Artikel.
[Anmerkung] Eine Geschichte darüber, dass es nicht möglich ist, den Proxy mit pip zu durchbrechen