[Road to Intermediate Python] Rufen Sie eine Klasseninstanz wie eine Funktion mit __call__ auf

Link zur Zusammenfassung

https://qiita.com/ganariya/items/fb3f38c2f4a35d1ee2e8

Einführung

Um Python zu studieren, habe ich eine Group Intelligence Library namens acopy kopiert.

In acopy werden viele interessante Python-Grammatiken und -Sprachen verwendet, und es wird zusammengefasst, dass es unter ihnen nützlich ist.

Schauen wir uns diesmal das Attribut __call__ an, das eine Instanz einer Klasse wie eine Funktion aufruft.

Attributmethode __call__

Wenn Sie das Attribut __call__ in einer Klasse definieren, Sie können die Instanz wie eine Funktion mit dem Operator () aufrufen.

class Person:

    def __init__(self, age, name):
        self.age = age
        self.name = name

    def __repr__(self):
        return f'age = {self.age}, name = {self.name}'

    def __call__(self, *args, **kwargs):
        return self.name


'''
age = 20, name = ron
ron
'''
p = Person(20, 'ron')
print(p)
print(p())

Im obigen Beispiel ist das Attribut __call__ in der Person-Klasse definiert. Dies gibt den Namen von p zurück, wenn die Instanz aufgerufen wird, wie bei einem Funktionsaufruf.

Auf diese Weise kann __call__ wie eine Funktion aufgerufen werden.

Anwendungsbeispiel

Wie glücklich ist es mit diesem ()?

Einfache Schnittstelle

Ich denke nicht, dass es viel getan werden sollte, sondern als einfache Schnittstelle Ich frage mich, ob es verwendet werden kann.

class Add:

    def __init__(self, x):
        self.x = x

    def __call__(self, y):
        return self.x + y


class Sub:

    def __init__(self, x):
        self.x = x

    def __call__(self, y):
        return self.x - y


'''
20
10
50
'''
arr = [Add(10), Sub(20), Add(40)]
for ice in arr:
    print(ice(10))

Ich denke es ist etwas anderes.

Geben Sie der Funktion einen Zustand

Ich denke, das ist hauptsächlich die Bedeutung davon. In C ++ gibt es ein Funktionsobjekt mit () in der Struktur. Dies ist mein Artikel, der es berührt hat. (Es gibt keinen Grund, warum meine ungeordnete_Karte den Paartyp nicht als Schlüssel verwenden kann)

Es ist schwer, einer Funktion einen Zustand zu geben, aber eine Klasse kann leicht einen Zustand haben. Dann ist es möglich, die Häufigkeit zu ermitteln, mit der der Operator "()" verwendet wird, und das Berechnungsergebnis, z. B. DP für schwere Verarbeitung.

class Count:
    cls_count = 0

    def __init__(self):
        self.count = 0

    def __call__(self, *args, **kwargs):
        self.count += 1
        Count.cls_count += 1
        return self.count, Count.cls_count


c1 = Count()
c2 = Count()

'''
(1, 1)
(1, 2)
(2, 3)
(3, 4)
(2, 5)
'''
print(c1())
print(c2())
print(c1())
print(c1())
print(c2())

Im obigen Code erstellen wir eine Count-Klasse und rufen sie als Funktion auf. Intern werden die Variablen und internen Zustände "cls_count, count" gespeichert.

Das Obige ist ein gutes Beispiel, aber Sie können den internen Status in einem Funktionsaufruf namens () speichern.

Darüber hinaus ist das Folgende ein Funktionsaufruf für das Eratostenes-Sieb. Nach einmaliger Berechnung wird der intern zwischengespeicherte Wert zurückgegeben.

class Era:

    def __init__(self, N):
        self.N = N
        self.primes = []
        self.ready = False

    def __call__(self, x):
        if self.ready:
            return self.primes[x]
        else:
            self.primes = [True] * (self.N + 1)
            self.primes[0] = self.primes[1] = False

            i = 2
            while i * i <= self.N:
                if self.primes[i]:
                    for j in range(i * 2, N + 1, i):
                        self.primes[j] = False
                i += 1
            return self.primes[x]


N = 100
era = Era(N)

for i in range(0, N + 1):
    print(i, era(i))

Auf diese Weise möchte ich es wie eine Funktion mit "()" von außen aufrufen, aber wenn ich einen internen Status haben möchte, scheint es gut, "call" zu verwenden.

Verweise

Recommended Posts

[Road to Intermediate Python] Rufen Sie eine Klasseninstanz wie eine Funktion mit __call__ auf
Ein Weg zum mittleren Python
[Road to Intermediate Python] Definieren Sie die Funktion __getattr__ in der Klasse
Erstellen Sie mit Class einen Python-Funktionsdekorator
So rufen Sie eine Funktion auf
[Road to Intermediate Python] Definieren Sie in Ihrer eigenen Klasse
[Python] So rufen Sie eine Funktion von c aus Python auf (ctypes edition)
[Python] Weg zur Schlange (5) Spiele mit Matplotlib
[Road to Intermediate Python] Installieren Sie Pakete in großen Mengen mit pip
Erstellen Sie einen Mastodon-Bot mit einer Funktion, die automatisch mit Python antwortet
Verwendung der Methode __call__ in der Python-Klasse
[Road to Intermediate Python] Aktiviert Vergleichsoperationen mit Originalklassen
[Python] Weg zur Serpent (3) Python-Klasse
[Python] Erbt eine Klasse mit Klassenvariablen
[Road to Intermediate] Grundlegendes zu Python-Eigenschaften
[Einführung in Python] So teilen Sie eine Zeichenfolge mit der Funktion split
[Python 3.8 ~] Wie man rekursive Funktionen mit Lambda-Ausdrücken intelligent definiert
Fühlen wir uns wie ein Materialforscher mit Python [Einführung in Pymatgen]
[Road to Intermediate Python] Verwenden Sie ternäre Operatoren
[Python] Wie man eine Klasse iterierbar macht
[Road to Intermediate Python] Verwenden Sie Lambda-Ausdrücke
Der Weg zum Kompilieren zu Python 3 mit Thrift
[Road to Intermediate Python] Zusammenfassung der Artikelverknüpfungen
[Python] Erklärt anhand eines konkreten Beispiels, wie die Bereichsfunktion verwendet wird
Treffen Sie eine Methode einer Klasseninstanz mit der Python Bottle Web API
[Einführung in Python] So schreiben Sie eine Zeichenfolge mit der Formatierungsfunktion
Python-Klasse, Instanz
Lesen einer CSV-Datei mit Python 2/3
Senden Sie eine Nachricht mit Python an LINE (LINE Notify)
[Python] Der Weg zur Schlange (4) Numpy zwicken
[Python] Weg zur Schlange (6) Manipuliere Pandas
Versuchen Sie, mit Python eine Lebenskurve zu zeichnen
Ich möchte ein Spiel mit Python machen
[Hinweis] Erstellen Sie mit Python eine einzeilige Zeitzonenklasse
Versuchen Sie, in Python einen "Entschlüsselungs" -Code zu erstellen
[Road to Intermediate] Python scheint alles Objekte zu sein
Python: Bereiten Sie einen Serializer für die Klasseninstanz vor:
Entscheide dich für einen Laborauftrag mit Python (Fiktion)
Schritte zum Erstellen eines Twitter-Bots mit Python
Versuchen Sie, mit Python eine Diedergruppe zu bilden
[Go] So schreiben oder rufen Sie eine Funktion auf
Ich möchte mit Python in eine Datei schreiben
Zubu Amateur will Python starten
[Python] Erstellt eine Klasse, um mit pyaudio Sinuswellen im Hintergrund zu spielen
So konvertieren / wiederherstellen Sie einen String mit [] in Python
[Python] Wie zeichnet man mit Matplotlib ein Liniendiagramm?
Lassen Sie uns ein Befehls-Standby-Tool mit Python erstellen
[Einführung in Python] Wie iteriere ich mit der Bereichsfunktion?
Python Ver. Einführung in WebPay mit ein wenig Code
[Übung] Erstellen Sie eine Watson-App mit Python! # 2 [Übersetzungsfunktion]
So konvertieren Sie ein Klassenobjekt mit SQLAlchemy in ein Wörterbuch
Zeichnen Sie gewaltsam so etwas wie ein Flussdiagramm mit Python, matplotlib
Erstellen Sie mit OpenCV eine Funktion zum Beschreiben japanischer Schriftarten
Ich möchte mit einem Roboter in Python arbeiten.
Vom Kauf eines Computers bis zur Ausführung eines Programms auf Python