https://qiita.com/ganariya/items/fb3f38c2f4a35d1ee2e8
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.
__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.
Wie glücklich ist es mit diesem ()
?
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.
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.
Recommended Posts