[Python-de] Klassenmethoden

Diez B. Roggisch deets at web.de
Fr Jul 19 17:41:21 CEST 2013


Hallo Frank,

bitte auch an die Liste antworten.


> Also der gepostete Code ist nur ein Beispiel und was die Variablenbenennung betrifft hast Du natürlich recht. Der Code sollte lediglich mein Problem deutlich machen. Es ist natürlich richtig, dass sobald eine Instanz gebildet wurde die entsprechenden Klassenattributen nur für diese Instanz gelten.
>  
> Vielleicht hätte ich anders fragen sollen.
>  
> 1.     Wenn auf Methoden der Art „def foo(self, bar)“ nur über Instanzen zugegriffen werden kann welchen Sinn machen dann Klassenmethoden wenn sie nicht den Umfang der Klasse mit allen Methoden nutzen können. Auf die Klassenattribute kann ich ja auch per cls.attribut zugreifen und dachte es würde eben auch per cls.foo(bar) gehen

Der Sinn von Klassenmethoden liegt darin, dass du 

  - sie transparent von normalen Methoden aus aufrufen kannst. Denn sowas geht problemlos:

class Foo(object):

   def bar(self):
          self.pillepalle()


   @classmethod
   def pillepalle(cls):
          …


 - du mit ihnen (ueberladbare) Factory-Funktionen zB erzeugen kannst. Sowas hier etwa geht:


class Base(object):

   ALL_MY_INSTANCES = {}
   @classmethod
   def create(cls, name):
          obj = cls(name)
          cls.ALL_MY_INSTANCES[name] = obj
          return obj


class Impl(Base):
     ….


Impl.create(name)

Das geht natuerlich auch noch anders, aber es kann gelegentlich nett sein.

 - du solche Methoden wie oben genannt transparent benutzen, aber ohne Instanz testen kannst

Ich mache sowas recht haeufig, wenn ich eine Methode habe, die ich losgeloest testen will. Natuerlich koennte man die auch immer als modul-Funktion schreiben, und dann aufrufen. Aber bezogen auf die logische Gruppierung ist die Klasse schon der geeignete Ort, und durch den oben beschriebenen transparenten Aufruf einfach zu verwenden. Inklusive Ueberladungsmoeglichkeit, was beim modul dann wieder nicht geht.
   

>  
> 2.     Ich habe eine Klasse geschrieben mit der ich fließkommazahlen an einer beliebigen Stelle runden kann. Die Methode hierzu lautet round2nks(nachkommastelle, zahl). Weitere Methoden der Klasse wandeln die Zahl in einen String von da in eine Liste dann wird das Komma herausgelöst, die entsprechende Stelle gerundet und hinterher alles wieder zusammengesetzt und als float zuückgegeben. Jetzt möchte ich aber keine Instanz der Klasse „FlexFloat“ bilden sondern mittels „from floatmanagement import FlexFloat as fl“ und mit fl.round2nks(2, 45.432845) die Operation ausführen, was natürlich nicht funktioniert da round2nks() auf weitere Methoden der Klasse zugreift. Ich vermute man würde ein Modul und keine Klasse schreiben und die einzelnen Methoden in das Modulfile packen? Vielleicht hast Du einen Tipp wie man das machen kann oder kannst mich auf eine Webseite verweisen die solche Probleme behandelt das googeln nach @classmethod hat nicht die rechten Beispiele zu Tage gefördert.


Genau, das obige Beispiel ist im Grunde ein Missbrauch einer Klasse. Ein Modul waere moeglich, und meistens auch die richtigere Loesung.

Trotzdem kann man bei der Implementierung bleiben (komplett mit classmethods), weil man sich damit einen Namensraum schafft (FlexFloat) ohne dazu eine eigene Datei anlegen zu muessen. Ist Abwaegungssache, und ich wuerde ueblicherweise dazu raten, dass einfach als Modul zu machen.

Diez

-------------- nächster Teil --------------
Ein Dateianhang mit HTML-Daten wurde abgetrennt...
URL: <http://mail.python.org/pipermail/python-de/attachments/20130719/577e98cf/attachment-0001.html>


Mehr Informationen über die Mailingliste python-de