Martijn richtig ist, dass ein neuer Methoden Objekte von .__get__
erzeugten so ihre Adreßzeiger nicht gleichzusetzen mit einem is
Bewertung. Beachten Sie, dass die Verwendung von ==
in Python 2.7 wie vorgesehen ausgewertet wird.
Python2.7
class Test(object):
def tmethod(self):
pass
>>> Test.meth is Test.meth
False
>>> Test.meth == Test.meth
True
>>> t = Test()
>>> t.meth is t.meth
False
>>> t.meth == t.meth
True
beachte jedoch, dass von einer Instanz referenzierten Methoden nicht gleichzusetzen mit denen aus der Klasse referenziert, da die Referenz selbst zusammen mit dem Verfahren von einer Instanz ausgeführt.
>>> t = Test()
>>> t.meth is Test.meth
False
>>> t.meth == Test.meth
False
In Python 3.3 die is
Operator für Methoden verhält sich häufiger die gleiche wie die ==
so erhalten Sie das erwartete Verhalten, anstatt in diesem Beispiel. Dies ergibt sich sowohl aus __cmp__
verschwinden und eine sauberere Methode Objektdarstellung in Python 3; Methoden haben nun __eq__
und Verweise sind keine fliegenden Objekte, so dass das Verhalten folgt, wie man es erwarten könnte, ohne Python 2-Erwartungen.
Python3.3
>>> Test.meth is Test.meth
True
>>> Test.meth == Test.meth
True
>>> Test.meth.__eq__(Test.meth)
True
Dies funktioniert in Python 3 btw. – poke