statische Methoden oder Klassenmethoden

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

statische Methoden oder Klassenmethoden

Beitragvon leobm » Montag 31. Oktober 2005, 00:03

Ok, soviel ich verstanden habe gibt es in von Haus aus keine wirklichen statischen Methoden. Bitte berichtigen wenn ich falsch liege. Ich habe
nun folgende Möglichkeit im Netz gefunden die ich erweitert habe.

Code: Alles auswählen

class Callable:
    def __init__(self, anycallable):
        self.__call__ = anycallable
            
class A:
    def doit():
      """ -----hier will ich auf B.x zugreifen-----""""
      
    doit = Callable(doit)
   
class B(A):
   
    x = 'hello'
   
    def test():
   A.doit()

    test = Callable(test)
   
B.test()


Das funktioniert im Prinzip auch schon so wie ich es mir vorstelle.
Was ich jetzt gerne hätte ist das von einer statischen Methode in der Klasse "A" auf den statischen Wert in B zugreifen kann. Ohne das diese statische Methode Klasse B kennen muss.
ich dachte so etwas wie in die Richtung:

Code: Alles auswählen

self.__class__.__name__.x


Was natürlich in einer statischen Methode nicht mehr funktioniert.

Hat einer eine Lösung für mein Problem ?

Gruß, Felix
henning
User
Beiträge: 274
Registriert: Dienstag 26. Juli 2005, 18:37

Beitragvon henning » Montag 31. Oktober 2005, 07:07

Also zunächst mal solltest du genau zwischen zwei Sachen unterscheiden: Statische Methoden und Klassenmethoden.
Statische Methoden brauchen "nichts", "wissen" dafür aber auch nichts von der Klasse in der sie definiert wurden geschweige denn irgendwas von einer Instanz.

Diese Verwirrung kommt höchstwahrscheinlich von anderen Programmiersprachen, die an der Stelle nicht sauber unterscheiden oder zumindest andere Begrifflichkeiten haben.

Was du suchst sind wohl eher Klassenmethoden, die statt einer Instanz die Klasse als Parameter kriegen in der man sie definiert hat. Dafür gibt es schon ein builtin namens classmethod. Wenn du wirklich statische Methoden haben willst (wie du sie mit Callable erzeugt hast), empfehle ich die das builtin staticmethod (welches genau wie classmaethod verwendet wird)

Code: Alles auswählen

>>> class A:
...   def doit(cls):
...     """ Eine Klassenmethode. """
...     print "Meine Klasse definiert x so:", cls.x
...   doit = classmethod(doit)
...
>>> class B(A):
...   x = 'hello'
...   def test(cls):
...     """ Auch dies ist eine Klassenmethode. """
...     cls.doit()
...   test = classmethod(test)
...
>>> B.test()
Meine Klasse definiert x so: hello
CM
User
Beiträge: 2464
Registriert: Sonntag 29. August 2004, 19:47
Kontaktdaten:

Beitragvon CM » Montag 31. Oktober 2005, 11:47

Warum das mitunter nützlich ist: hier
Sorry für die Eigenwerbung ...

Gruß,
Christian
Gast

Beitragvon Gast » Montag 31. Oktober 2005, 12:51

danke, genau was ich gesucht habe.

Wer ist online?

Mitglieder in diesem Forum: egon11, Whitie