Martijn ma rację, że nowe metody są obiekty generowane przez .__get__
więc ich wskaźniki adresowych nie utożsamiają ze związkiem is
oszacowanie. Zauważ, że używanie ==
będzie oceniać zgodnie z zamierzeniami w Pythonie 2.7.
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
jednak zauważyć, że użyte metody z przykładu nie są równe tym z grupy odniesienia, ponieważ odniesienia siebie prowadzone wraz ze sposobem z przykładu.
>>> t = Test()
>>> t.meth is Test.meth
False
>>> t.meth == Test.meth
False
W Pythonie 3.3 operatora is
metod częściej zachowuje się tak samo jak ==
więc uzyskać oczekiwane zachowanie, a nie w tym przykładzie. Wynika to z zaniku zarówno __cmp__
, jak i czystszej reprezentacji obiektu metody w Pythonie 3; Metody mają teraz __eq__
, a referencje nie są obiektami wbudowanymi, więc zachowanie jest zgodne z oczekiwaniami bez oczekiwań Pythona 2.
Python3.3
>>> Test.meth is Test.meth
True
>>> Test.meth == Test.meth
True
>>> Test.meth.__eq__(Test.meth)
True
Działa w języku Python 3 btw. – poke