Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
class Test():
def __call__(self):
x = 'foo' * 5000000000
y = 'bar'
z = 15
return z
z = Test()()
Wenn ich eine Klasse habe, die für mich eine Aufgabe erledigt und am Ende interessieren mich nur zwei Variablen in dieser Klasse, brauche ich ja im Grunde genommen keine Instanz dieser Klasse.
Ist sowas wie das Beispiel oben dann eine gute Idee? Ich bin mir halt nicht sicher, weil wenn es so eine gute Idee wäre, dürfte ja wohl auch __init__ etwas anderes als None zurückgeben und es wäre überflüssig dieses Hindernis auf diese Weise zu umgehen.
Du hast doch auch hier eine Instanz der Klasse, aber du simulierst eine Funktion auf umständliche Art und Weise, keine Ahnung was du genau damit bezwecken willst.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
__marcus__ hat geschrieben:Ist sowas wie das Beispiel oben dann eine gute Idee?
Nein in zweierlei Hinsicht. Erstens ist es in aller Regel müßig, einzelne Bytes sparen zu wollen (insbesondere wo du versucht, einen 15 GB großen String anzulegen! Da spielt dein Test-Exemplar keine Rolle) und auch nur eine Sekunde über den Speicherverbrauch eines einzelnen Exemplars der Klasse nachdenken zu wollen und zweitens braucht du einfach eine Funktion
Ach so ja, gut, dann mache ich das nicht mit __call__ sondern nehme einfach eine normale Funktion. Danke. (Es ging mir halt darum, dass in der Klasse sowieso viel Müll anfällt und ich wissen wollte, wie ich den am Besten loswerde ohne in der Klasse einzelne Variablen zu löschen.)
@__marcus__: Wo fällt da viel Müll an, den man "löschen" müsste? Du bindest ja nichts an das Exemplar. Der Müll fällt nicht "in der Klasse" an, sondern wird in der Methode an lokale Namen gebunden. Da besteht kein Unterschied zu einer Funktion.
In [36]: import itertools
In [37]: my_counter = itertools.count(10).next
In [38]: my_counter()
Out[38]: 10
In [39]: my_counter()
Out[39]: 11
In [40]: my_counter()
Out[40]: 12