Seite 1 von 1

statische Methoden oder Klassenmethoden

Verfasst: Montag 31. Oktober 2005, 00:03
von leobm
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

Verfasst: Montag 31. Oktober 2005, 07:07
von henning
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

Verfasst: Montag 31. Oktober 2005, 11:47
von CM
Warum das mitunter nützlich ist: hier
Sorry für die Eigenwerbung ...

Gruß,
Christian

Verfasst: Montag 31. Oktober 2005, 12:51
von Gast
danke, genau was ich gesucht habe.