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

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

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:

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

Gruß,
Christian
Gast

danke, genau was ich gesucht habe.
Antworten