In [811]: a = A()
In [812]: a.m is a.m
Out[812]: False
In [813]: a.m == a.m
Out[813]: True
@Dauerbaustelle: Wenn man von einem Exemplar eine Methode abfragt wird da jedesmal ein *neues* Objekt zurückgegeben und das liegt halt nicht immer an der selben Adresse.
In [1]: class Foo(object):
...: def meth(self):
...: pass
...:
In [2]: foo = Foo()
In [3]: foo.meth is foo.meth
Out[3]: False
In [4]: id(foo.meth) == id(foo.meth)
Out[4]: True
@Dauerbaustelle: In beiden Fällen hat man einen binären Operator bei dem erst das linke und dann das rechte Argument ausgewertet wird.
Fall 1: Links: ``foo.meth`` erzeugt ein aufrufbares Objekt an einer bestimmten Adresse. Rechts: ``foo.meth`` erzeugt ein anderes aufrufbares Objekt an einer anderen Adresse. ``is`` vergleicht die Identität der beiden unterschiedlichen Objekte.
Fall 2: Links: ``id(foo.meth)`` erzeugt ein aufrufbares Objekt an einer bestimmten Adresse, übergibt es an die `id()`-Funktion, die liefert eine Zahl, das aufrufbare Objekt wird nicht mehr gebraucht und der Speicher wird wieder freigegeben. Rechts: ``id(foo.meth)`` erzeugt ein aufrufbares Objekt an der eben gerade freigewordenen Adresse an der auch das andere Objekt lag. Die `id()`-Funktion liefert die gleiche Zahl. ``==`` ergibt bei gleichen Zahlen konsequenterweise `True`.
`id()` garantiert nur unterschiedliche Werte bei Objekten die gleichzeitig existieren. Andererseits darf man sich auf das beobachtete Verhalten auch nicht verlassen, denn das CPython für die `id()`-Funktion die Adresse liefert ist ein Implementierungsdetail. Die Implementierung könnte genausogut jedem erzeugten Objekt eine "Seriennummer" verpassen die hochgezählt wird. Jython macht das zum Beispiel so wenn ich mich recht erinnere.
Das ganze ist auf das nötigste beschränkt und ist etwas zusammenkopiert, es kann daher sein das kleine Fehler im Code sind. Ich hoffe das Problem kann man irgendwie lösen