@droptix: Konstruktoren im eigentlichen Sinn gibt es in Python überhaupt nicht.
__init__() ist ein Initializer, also eine Methode, die nicht ein neues Objekt konstruiert, sondern ein bestehendes Objekt initialisiert. Deswegen heist sie
__init__(), andernfalls hieße sie wohl
__constr__(). Es gibt auch die statische Methode
__new__(), aber auch diese ist im eigentlichen Sinn kein Konstruktor, weil dazu die eigenhändige Allokation von Speicher gehören würde, was in Python aber nicht nötig ist.
Wenn du "Klassenmethode" schreibst, meinst du einfach nur Methode. Eine Klassenmethode ist eine Methode einer Klasse selbst, im Gegensatz zu einer Methode eines Objekts der Klasse. Klassen sind nämlich selbst Objekte in Python:
Code: Alles auswählen
class Foo(object):
def bar(self):
print self
@classmethod
def baz(cls):
print cls
f = Foo()
f.bar()
Foo.baz()
Ergebnis:
Code: Alles auswählen
<__main__.Foo object at 0x7fee136c>
<class '__main__.Foo'>
Methoden - egal ob normale oder Klassenmethoden - werden im
__dict__ der Klasse gehalten. Attribute, die in
__init__() einem Objekt angetackert werden, werden im
__dict__ dieses Objekts gespeichert. Was dort gespeichert wird, ist egal. Wenn es sich dabei um eine Funktion handelt, passiert dabei nichts anderes, als wenn es sich um einen String oder ein Integer handelt. Wenn du auf eine so gespeicherte Funktion zugreifen möchtest, dann passiert nichts besonderes. Deswegen wird in diesem Fall auch nicht die Referenz auf das Objekt als erstes Argument übergeben, wie es der Fall wäre, wenn es sich um eine Methode - also eine Funktion, die im
__dict__ der Klasse gehalten wird - handeln würde. Deswegen must du das selbst erledigen.
Falls dir der Unterschied zwischen einer Klasse und einem Objekt einer Klasse nicht klar ist, hilft vielleicht dies: Die Klasse
str ist die Klasse aller Pythonstrings, aber sie ist selbst kein String:
Ergebnis:
Hier nochmal ein anderes Beispiel:
Code: Alles auswählen
def test():
pass
class Zigzag(object):
def __init__(self):
self.x = 1
self.g = test
def f(self):
pass
z = Zigzag()
print Zigzag.__dict__
print '-------------------------------------------------------'
print z.__dict__
Ergebnis:
Code: Alles auswählen
{'__module__': '__main__', 'f': <function f at 0x7fed57d4>, '__dict__': <attribute '__dict__' of 'Zigzag' objects>, '__weakref__': <attribute '__weakref__' of 'Zigzag' objects>, '__doc__': None, '__init__': <function __init__ at 0x7fed5454>}
-------------------------------------------------------
{'x': 1, 'g': <function test at 0x7fed5224>}
In specifications, Murphy's Law supersedes Ohm's.