statische Klasse in python

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
Twilo
User
Beiträge: 109
Registriert: Mittwoch 10. Januar 2007, 19:17
Wohnort: Berlin
Kontaktdaten:

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
[url=http://www.farb-tabelle.de/][b]Farbtabelle[/b][/url]
pyStyler
User
Beiträge: 311
Registriert: Montag 12. Juni 2006, 14:24

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
Twilo
User
Beiträge: 109
Registriert: Mittwoch 10. Januar 2007, 19:17
Wohnort: Berlin
Kontaktdaten:

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
[url=http://www.farb-tabelle.de/][b]Farbtabelle[/b][/url]
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.
Twilo
User
Beiträge: 109
Registriert: Mittwoch 10. Januar 2007, 19:17
Wohnort: Berlin
Kontaktdaten:

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
[url=http://www.farb-tabelle.de/][b]Farbtabelle[/b][/url]
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.
Twilo
User
Beiträge: 109
Registriert: Mittwoch 10. Januar 2007, 19:17
Wohnort: Berlin
Kontaktdaten:

Hallo,

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

Code: Alles auswählen

#!/usr/bin/python

variable1 = ''
variable2 = ''

class name:
  ...
mfg
Twilo
[url=http://www.farb-tabelle.de/][b]Farbtabelle[/b][/url]
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.
mitsuhiko
User
Beiträge: 1790
Registriert: Donnerstag 28. Oktober 2004, 16:33
Wohnort: Graz, Steiermark - Österreich
Kontaktdaten:

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.
TUFKAB – the user formerly known as blackbird
Benutzeravatar
sunmountain
User
Beiträge: 89
Registriert: Montag 13. März 2006, 17:18

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.
Zuletzt geändert von sunmountain am Freitag 11. Mai 2007, 21:40, insgesamt 1-mal geändert.
Benutzeravatar
sunmountain
User
Beiträge: 89
Registriert: Montag 13. März 2006, 17:18

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
Twilo
User
Beiträge: 109
Registriert: Mittwoch 10. Januar 2007, 19:17
Wohnort: Berlin
Kontaktdaten:

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
[url=http://www.farb-tabelle.de/][b]Farbtabelle[/b][/url]
Benutzeravatar
sunmountain
User
Beiträge: 89
Registriert: Montag 13. März 2006, 17:18

Twilo hat geschrieben: Somit kann die Aussage des Dozenten nicht korrekt sein :o
Ein sehr bekanntes Problem, nicht nur in der Literatur
fr3sh
User
Beiträge: 3
Registriert: Mittwoch 20. Dezember 2006, 17:09
Wohnort: in da south of germany

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
frabron
User
Beiträge: 306
Registriert: Dienstag 31. März 2009, 14:36

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
JonasR
User
Beiträge: 251
Registriert: Mittwoch 12. Mai 2010, 13:59

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? :-/
BlackJack

@JonasR: `Foo.bar()` ist ganz offensichtlich eine statische Methode.
JonasR
User
Beiträge: 251
Registriert: Mittwoch 12. Mai 2010, 13:59

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. :)
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

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.
Das Leben ist wie ein Tennisball.
JonasR
User
Beiträge: 251
Registriert: Mittwoch 12. Mai 2010, 13:59

EyDu danke für die Erklärung :)
Antworten