[Python-de] Klassenmethoden

Diez B. Roggisch deets at web.de
Fr Jul 19 15:48:14 CEST 2013


Hallo Frank,

> Ich möchte einige Methoden einer Klasse verwenden ohne zuvor eine Instanz der Klasse anlegen zu müssen.
>  
> Wie ich in Erfahrung gebracht habe ist dies mit dem Schlüsselwort @classmethod vor der eigentlichen Methode möglich wenn diese Methode ihre Zugriffe über cls und nicht self referenziert.
>  
> Offensichtlich ist es mir allerdings nicht möglich eine Methode der Klasse hiermit zu verwenden die sich auf eine Instanz bezieht also mit def foo(self, …)
> erstellt ist?
>  
> Gibt es eine Möglichkeit dies zu lösen oder muss ich jetzt alle Methoden der Klasse als Klassenmethoden ausweisen und cls statt self verwenden? Hierbei würde es allerdings wenig Sinn machen noch eine Klasse zu definieren, da könnte ich ja auch alle Methoden direkt in ein modulfile schreiben.

Wie soll denn das gehen? Nehmen wir mal an du hast 1000 Instanzen der Klasse A. Und jetzt rufst du von deiner Klassenmethod eine "normale", sprich Instanzmethode, auf.

Welche der 1000 Instanzen solls denn dann bitteschoen sein? Soll das per Los entschieden werden, oder die letzte, oder erste, oder ….

Mit anderen Worten: ja, aus Klassenmethoden kannst du nur auf Klassenmethoden (oder anderen Code) zugreifen.

Wie waere es, wenn du mal dein konkretes Beispiel erlaeuterst, warum du das ueberhaupt tun willst?


>  
> Hier ein kleines Beispiel was ich meine:
>  
> << 
> class ModulTest():
>     ''' Kurze Beschreibung der Klasse
>         und ihrer Mehtoden
>     '''
>     Liste= []
>     String = "0"
>     fl_val = 0.0
>     int_val = 0


Das hier ist in vielerlei hinsicht grosser Unfug - ich glaube nicht, dass dir bewusst ist, was du da eigentlich genau tust.

Alle diese Werte sind *KLASSENATTRIBUTE*. Mit anderen Worten: jede Instanz teilt sich genau *EINE* "Liste". Damit endent also jede Zahl aus "verarbeite" in einer einzigen, globalen Liste.

Zum zweiten ist deine Benennung mehr als fragwuerdig. Weder in Python noch in anderes Programmiersprachen sollte man Namen von Attributen/Variablen mit ihrem Typ qualifizieren. Denn wenn aus der Liste ein Dictionary oder aus int_val ein float wird, geht das grosse Zaehneklappern los. Sprechende Namen bezeichen den Verwendungszweck - nicht den Typ.

Last but not Least - der bestaendige Wechsel zwischen CamelCase und kleinschreibung_mit_unterstrichen ist inkonsistent und damit schlecht zu lesen. Standard in Python ist letzteres, anders machen kannst du's natuerlich trotzdem - aber mischen sollte man nicht.


>  
>     def __init__(self):
>         ''' Kurze Beschreibung der Funktion
>             Kurze Beschreibung der Argumente
>             Kurze Beschreibung der Rueckgabewerte
>         '''
>     pass
>  
>     def verarbeite(self, Zahl):
>         self.String = str(Zahl)
>         for i in self.String:
>             self.Liste.append(i)

Diese Methode braucht ja auch (bei der gegebenen, ggf. fehlerhaften Implementierung) kein self, weil sie an die globale "Liste" anfuegt. Also kannst  du die auch zur classmethod machen.

Ob das sinnvoll ist - keine Ahnung.


Und zu guter letzt: muss das mit dem riesen Bild als Anhang sein? Diese Liste ist werbefrei - und sollte das auch bleiben finde ich.

Diez

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


Mehr Informationen über die Mailingliste python-de