Design, Garbage

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.
__marcus__
User
Beiträge: 92
Registriert: Mittwoch 10. September 2008, 22:10
Wohnort: Hamburg

Design, Garbage

Beitragvon __marcus__ » Samstag 25. Oktober 2008, 10:14

Code: Alles auswählen

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.
Benutzeravatar
Leonidas
Administrator
Beiträge: 16023
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Beitragvon Leonidas » Samstag 25. Oktober 2008, 10:17

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 Modvoice
sma
User
Beiträge: 3018
Registriert: Montag 19. November 2007, 19:57
Wohnort: Kiel

Re: Design, Garbage

Beitragvon sma » Samstag 25. Oktober 2008, 10:32

__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

Code: Alles auswählen

def wtf(): return 15


Stefan
farid
User
Beiträge: 95
Registriert: Mittwoch 8. Oktober 2008, 15:37

Re: Design, Garbage

Beitragvon farid » Samstag 25. Oktober 2008, 10:43

__marcus__ hat geschrieben:Ist sowas wie das Beispiel oben dann eine gute Idee?


Funktionsobjekte (callables) sind nur dann sinnvoll, wenn man den Zustand manipuliert:

Code: Alles auswählen

class Counter(object):
    def __init__(self, init=0):
        self.value = init

    def __call__(self):
        self.value = self.value + 1
        return self.value


Jetzt kannst Du einen Zaehler simulieren:

Code: Alles auswählen

>>> myCounter = Counter(0)
>>> myCounter()
1
>>> myCounter()
2

>>> myOtherCounter = Counter(10)
>>> myOtherCounter()
11
>>> myCounter()
3
__marcus__
User
Beiträge: 92
Registriert: Mittwoch 10. September 2008, 22:10
Wohnort: Hamburg

Beitragvon __marcus__ » Samstag 25. Oktober 2008, 10:45

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.)
BlackJack

Beitragvon BlackJack » Samstag 25. Oktober 2008, 11:09

@__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.
__marcus__
User
Beiträge: 92
Registriert: Mittwoch 10. September 2008, 22:10
Wohnort: Hamburg

Beitragvon __marcus__ » Samstag 25. Oktober 2008, 12:04

Nein, ursprüglich war es so,

data = Test(filename)

und dann habe ich auf

data.z

zugegriffen.

Aber jetzt ist alles gut und ich werde auch nie wieder vor dem Frühstück denken, dass ich vor schwerwiegenden Problemen stehe.
Benutzeravatar
birkenfeld
Python-Forum Veteran
Beiträge: 1603
Registriert: Montag 20. März 2006, 15:29
Wohnort: Die aufstrebende Universitätsstadt bei München

Re: Design, Garbage

Beitragvon birkenfeld » Samstag 25. Oktober 2008, 16:32

farid hat geschrieben:
__marcus__ hat geschrieben:Ist sowas wie das Beispiel oben dann eine gute Idee?


Funktionsobjekte (callables) sind nur dann sinnvoll, wenn man den Zustand manipuliert:

Code: Alles auswählen

class Counter(object):
    def __init__(self, init=0):
        self.value = init

    def __call__(self):
        self.value = self.value + 1
        return self.value


Jetzt kannst Du einen Zaehler simulieren:

Code: Alles auswählen

>>> myCounter = Counter(0)
>>> myCounter()
1
>>> myCounter()
2

>>> myOtherCounter = Counter(10)
>>> myOtherCounter()
11
>>> myCounter()
3


Wobei man sich gerade in solchen Fällen die Klasse sparen und einen Generator verwenden kann.
Dann lieber noch Vim 7 als Windows 7.

http://pythonic.pocoo.org/
BlackJack

Beitragvon BlackJack » Samstag 25. Oktober 2008, 17:13

Und in diesem speziellen Fall…

Code: Alles auswählen

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

:-)

Wer ist online?

Mitglieder in diesem Forum: Google [Bot]