Seite 1 von 1

statische Klasse in python

Verfasst: Freitag 11. Mai 2007, 18:05
von Twilo
Hallo,

ich brauche in allen Klassen 2 Werte. Die beiden Werte stehen leider nur in unterschiedlichen Klassen zur Verfügung.

Mein Gedanke war, per Singleton bzw. Borg-Muster die 2 Werte in einer Klasse zu setzen.
Mein Dozent meint, das könnte man auch mit einer statischen Klasse realisieren. Man solle in einer statischen Klasse die Eigenschaften ändern können.
Stimmt das? Ich kann es mir nicht ganz vorstellen :K

meine Frage:
wie erstellt man unter python eine statische Klasse?
in meinen python Büchern "Objektorientierte Programmierung mit Python" und "Python Ge-Packt" kann ich zu statischen Klassen nichts finden.

mfg
Twilo

Verfasst: Freitag 11. Mai 2007, 18:42
von pyStyler
Hallo,
eventuell meinst Du Statische Methoden?

Code: Alles auswählen

class StaticMethod:
    def _string(s):
        return str(s)
    def _float(f):
        return float(f)
        
    _string = staticmethod(_string)
    _float = staticmethod(_float)
    
print StaticMethod._string('String')
print StaticMethod._float(2)
Gruss
pyStyler

Verfasst: Freitag 11. Mai 2007, 19:02
von Twilo
Hallo,
pyStyler hat geschrieben:eventuell meinst Du Statische Methoden?

Code: Alles auswählen

class StaticMethod:
    def _string(s):
        return str(s)
    def _float(f):
        return float(f)
        
    _string = staticmethod(_string)
    _float = staticmethod(_float)
    
print StaticMethod._string('String')
print StaticMethod._float(2)
in C# soll es statische Klassen geben.

Wenn ich den Dozenten richtig verstanden habe, meint er in etwa soetwas

Code: Alles auswählen

class test:
  eigenschaft = 1
  def test(test1):
    ...
print test.eigenschaft
test.eigenschaft = 2
print test.eigenschaft
wie kann man eigentlich in python Eigenschaften festlegen?

mfg
Twilo

Verfasst: Freitag 11. Mai 2007, 19:11
von BlackJack
Du wirfst hier einiges wild durcheinander. Python ist nicht C#. In Python gibt es keine statischen Klassen, bei uns ist alles dynamisch. Wobei das `static` in C#, Java, C++, C in verschiedenen Kontexten auch noch eine unterschiedliche Bedeutung hat.

Welches Problem willst Du denn lösen? Wenn Du mit "Eigenschaften" Properties meinst, dann schau mal in der Doku nach der `property()`-Funktion.

Verfasst: Freitag 11. Mai 2007, 19:22
von Twilo
Hallo,
BlackJack hat geschrieben:Du wirfst hier einiges wild durcheinander. Python ist nicht C#.
das ist mir klar :wink:

ich muss für ein Tool, welches mit die Daten nicht so liefert, wie ich sie brauche, ein PlugIn schreiben.

Dieses Tool benutzt meine Klassen. Ich brauche 2 Werte, die an unterschiedlichen Klassen übergeben werden. Das Tool ruft 2 Klassen nacheinander auf, wo jeweils ein Wert davon übergeben wird. Danach werden die ganzen anderen Klassen aufgerufen, wo die 2 Werte benötigt werden.

Ich könnte die Daten jetzt in einer globalen Variable speichern. Das ist jedoch nicht gewünscht. Deshalb speichere ich die Daten in einer Klasse (Borg Entwufsmuster). Damit ich von jeder Klasse auf die Werte zugreifen kann.

der Dozent meinte, dass lässt sich doch mit einer statischen Klasse realisieren.
Ich weiss jedoch nicht, wie das funktionieren soll, bzw. ob das in python so überhaupt realisierbar ist.
Der Dozent programmiert nur mit VB.net und C#.

mfg
Twilo

Verfasst: Freitag 11. Mai 2007, 19:36
von BlackJack
Globale Variablen unerwünscht und Singleton/Borg-Klasse als Lösung ist ein Widerspruch. Singletons und Werte darin sind auch global. Module sind im Grunde Singletons, darum ist das auch die einfachste Lösung.

Verfasst: Freitag 11. Mai 2007, 19:41
von Twilo
Hallo,

ich meine, ich soll z.B. folgendes nicht tun

Code: Alles auswählen

#!/usr/bin/python

variable1 = ''
variable2 = ''

class name:
  ...
mfg
Twilo

Verfasst: Freitag 11. Mai 2007, 20:05
von BlackJack
Warum nicht? Ich meine es ist zwar eine "Regel" das globale Variablen nicht so gut sind, aber wenn man sie braucht, braucht man sie halt. Eine Klasse zu schreiben, die nur als Namensraum dient ist IMHO Missbrauch, weil Module dafür gedacht sind.

In C# *muss* man alles in eine Klasse packen. In Python braucht man das nicht unnötig verkomplizieren.

Verfasst: Freitag 11. Mai 2007, 20:07
von mitsuhiko
Globale Variablen in Python sind absolut OK, wenn man sie diese für globales Zeug verwendet. Immerhin sind globale nicht global sondern nur Modulmember. Richtige Globals wie in Ruby/PHP etc gibt es nur via __builtin__ patchen und das ist böse.

C# static classes

Verfasst: Freitag 11. Mai 2007, 21:37
von sunmountain
Hallo,

static classes in C# (http://msdn2.microsoft.com/en-us/librar ... S.80).aspx)
  • Können nur statische Member haben
  • Können nicht instanziert werden
  • Können keine Oberklasse sein
  • Können keinen Konstruktor haben
Der Sinn des Ganzen ?
sowas wie ein struct, bei dem ein malloc() oder new() nicht geht.

Es gibt keine Entsprechung dazu in Python (keine simple).

Code: Alles auswählen

class StaticClass:
    a = 100
    b = 200
trifft es schon ganz gut.
Der Rest ist pure Disziplin.

Verfasst: Freitag 11. Mai 2007, 21:39
von sunmountain
blackbird hat geschrieben:Globale Variablen in Python sind absolut OK
Aber genauso überflüssig wie

Code: Alles auswählen

goto DONTTRYTHISATHOME;
jedenfalls in fast allen Fällen

Re: C# static classes

Verfasst: Freitag 11. Mai 2007, 21:41
von Twilo
Hallo,
sunmountain hat geschrieben: static classes in C#
  • Können nur statische Member haben
  • Können nicht instanziert werden
  • Können keine Oberklasse sein
  • Können keinen Konstruktor haben
so hatte ich es auch in Erinnerung

Somit kann die Aussage des Dozenten nicht korrekt sein :o

mfg
Twilo

Re: C# static classes

Verfasst: Freitag 11. Mai 2007, 21:43
von sunmountain
Twilo hat geschrieben: Somit kann die Aussage des Dozenten nicht korrekt sein :o
Ein sehr bekanntes Problem, nicht nur in der Literatur

Re: statische Klasse in python

Verfasst: Dienstag 6. Dezember 2011, 10:44
von fr3sh
Ich glaube ich habe mit der Hilfe eines Kollegen eben die gesuchte Lösung gefunden, eine Statische Klasse zu erzeugen. Ich komme aus der C# Ecke und mir sagt die Methode mit dem Modulen nicht wirklich zu.

Gefunden hier: http://stackoverflow.com/questions/5313 ... self-to-it

Beispiel:

Code: Alles auswählen

class Foo(object):
    @staticmethod
    def bar():
        print "Static method called!"
Aufruf wie folgt:

Code: Alles auswählen

Foo.bar()
>> Static method called!
ciao

Re:

Verfasst: Dienstag 6. Dezember 2011, 10:52
von frabron
Bisschen spät ;)
Die Antwort hier ist immerhin die zweite im Thread, nur ohne den Decorator ...
pyStyler hat geschrieben:Hallo,
eventuell meinst Du Statische Methoden?

Code: Alles auswählen

class StaticMethod:
    def _string(s):
        return str(s)
    def _float(f):
        return float(f)
        
    _string = staticmethod(_string)
    _float = staticmethod(_float)
    
print StaticMethod._string('String')
print StaticMethod._float(2)
Gruss
pyStyler

Re: statische Klasse in python

Verfasst: Dienstag 6. Dezember 2011, 11:43
von JonasR
fr3sh hat geschrieben:Ich glaube ich habe mit der Hilfe eines Kollegen eben die gesuchte Lösung gefunden, eine Statische Klasse zu erzeugen. Ich komme aus der C# Ecke und mir sagt die Methode mit dem Modulen nicht wirklich zu.

Gefunden hier: http://stackoverflow.com/questions/5313 ... self-to-it

Beispiel:

Code: Alles auswählen

class Foo(object):
    @staticmethod
    def bar():
        print "Static method called!"
Aufruf wie folgt:

Code: Alles auswählen

Foo.bar()
>> Static method called!
ciao
Was ist dadran eine statische Methode? :-/

Re: statische Klasse in python

Verfasst: Dienstag 6. Dezember 2011, 12:29
von BlackJack
@JonasR: `Foo.bar()` ist ganz offensichtlich eine statische Methode.

Re: statische Klasse in python

Verfasst: Dienstag 6. Dezember 2011, 17:53
von JonasR
Ich hatte jetzt eher eine Erklärung zu statischen Funktion erwartet :D Aber ich glaube ich lese einfach mal die Doku zu @staticmethod
Ich denke bei statisch an etwas unabänderbares ich denke aber ich habe was falschen im Kopf :D

Ich bin halt nicht mit statischen Dingen in Programmiersprachen vertraut.

Edit 1 Mein Sprachstil in dem Post ist ja auch schlecht :D Ich Ich Ich Ich

Edit 2 Wenn ich meine Versuche jetzt richtig interpretiert habe, ist meine Vermutung der nicht änderbaren Funktion ja doch korrekt. Wäre über eine kleine Aufklärung sehr Glücklich. :)

Re: statische Klasse in python

Verfasst: Dienstag 6. Dezember 2011, 21:04
von EyDu
Statisch bedeutet in diesem Kontext, dass du keine Instanz vom Typ "foo" benötigst. Normalerweise würdest du die Methode so aufrufen:

Code: Alles auswählen

foo = Foo()
foo.bar()

#mit
class Foo(object):
    def bar(self):
        pass
Mittels "staticmethod" vereinfacht sich das ganze:

Code: Alles auswählen

Foo.bar()

#mit
class Foo(object):
    def bar():
        pass
An der Signatur von bar kannst du auch erkennen, dass du nun kein Zugriff mehr auf die Instanz hast.

Re: statische Klasse in python

Verfasst: Dienstag 6. Dezember 2011, 21:38
von JonasR
EyDu danke für die Erklärung :)