Static (Klassen),Methoden, Variablen ?

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.
Antworten
leobm
User
Beiträge: 24
Registriert: Montag 4. November 2002, 10:14
Wohnort: Hamburg

Wie definiere ich static Klassen, Methoden oder Variablen in Python ?
Voges
User
Beiträge: 564
Registriert: Dienstag 6. August 2002, 14:52
Wohnort: Region Hannover

Hallo!

Code: Alles auswählen

class Foo(object):
    
    statdata = "bar1"
        
    def statmethod(arg): 
        print arg

    statmethod = staticmethod(statmethod)        
  
print Foo.statdata
Foo.statmethod("bar2")
staticmethod() gibt es erst seit Version 2.2 und ist ein Feature der Klassen neuen Stils, also der Klassen, die von object abgeleitet sein müssen. Such mal bei Google in comp.lang.python nach "static methods" oder "static functions". Da erfährst Du dann auch wie es vorher ging. Wirklich ein viel diskutiertes Thema.

Zu statischen Klassen fällt mir nichts ein. Braucht man sowas?

Jan
hans
User
Beiträge: 728
Registriert: Sonntag 22. September 2002, 08:32
Wohnort: Sauerland
Kontaktdaten:

Wer kann denn mal einen alten Knaben aufklären? Was kann ich denn mit einer statischen Methode machen was ich mit einer normalem nicht hinbekomme?

Hans
Voges
User
Beiträge: 564
Registriert: Dienstag 6. August 2002, 14:52
Wohnort: Region Hannover

Hallo!
hans hat geschrieben:Was kann ich denn mit einer statischen Methode machen was ich mit einer normalem nicht hinbekomme?
Nichts, außer das Du kein Objekt erzeugen musst, um sie aufrufen zu können.

Mal ein simples Beispiel: Eine Klasse, die einen Monat repräsentiert.

Code: Alles auswählen

class Monat(object):
    _monatsnamen = ("Jan","Feb","Maerz","April","usw.")
    
    def __init__(self,nummer):  # 1 bis 12
        self.nummer = nummer
        
    def getName(self):
        return Monat._monatsnamen[self.nummer-1]

    def getAnzTage(self):
        pass  # sinnvoll ergaenzen

    def getMonatsnamen():
        return Monat._monatsnamen
    getMonatsnamen = staticmethod(getMonatsnamen)

m = Monat(2)
print m.getName()

print Monat.getMonatsnamen()
Bei der Erzeugung eines Objektes gibst Du die Monatszahl an und das Object liefert Dir danach alle möglichen Angaben zu diesem einen Monat. Soweit nichts neues.
Aber vielleicht interessieren Dich nur die Namen aller Monate. Diese Information kann die Klasse Monat liefern, auch ohne dass sie einen bestimmten Monat repräsentiert. Es muss also nicht extra ein Monatsobjekt erzeugt werden.

Es gibt noch weitere Anwendungsbereiche, z.B. bei Patterns (z.B. Factories), aber das ist ein Thema für sich.

Jan
leobm
User
Beiträge: 24
Registriert: Montag 4. November 2002, 10:14
Wohnort: Hamburg

@Voges: danke..
pSy
User
Beiträge: 44
Registriert: Montag 4. Oktober 2004, 17:58
Kontaktdaten:

Hallo... ich hoffe ich hab jetzt richtig aufgepasst und es nicht nur einfach übersehen, aber:
Wie mache ich statische Variablen? Also so, wie ich sie in C/C++ gewöhnt bin, dass ich sie einmal setze, sie in der gleichen Funktion zB inkrementiere und sie das nächste mal beim Funktionsaufruf immer noch inkrementiert sind.
Dookie
Python-Forum Veteran
Beiträge: 2010
Registriert: Freitag 11. Oktober 2002, 18:00
Wohnort: Salzburg
Kontaktdaten:

Hi pSy,

direkt statische Varibablen gibts bei Python nicht. Du kannst aber als optionalen Parameter eine Liste oder ein Dictionary angeben und dessen Inhalt verhält sich wie statische Variablen.

Code: Alles auswählen

def plusnr(string, nummer=[0]):
    nummer[0] += 1
    return string+str(nummer[0])

for i in xrange(10):
    print plusnr("Hallo")
Das selbe lässt sich aber auch meist mit Generatoren erreichen:

Code: Alles auswählen

def plusnr(string): # generator
    nummer = 0
    while True:
        nummer += 1
        yield string+str(nummer)

gen_plusnr = plusnr("Hallo")
for i in xrange(10):
    print gen_plusnr.next()
    

Gruß

Dookie
[code]#!/usr/bin/env python
import this[/code]
pSy
User
Beiträge: 44
Registriert: Montag 4. Oktober 2004, 17:58
Kontaktdaten:

danke für die schnelle antwort... :)
genau das habe ich gesucht.
Antworten