Ich denke, dass der PEP beschreibt __instancecheck__()
fehlerhaft ist. PEP 3119 sagt:
Der primäre Mechanismus hier vorgeschlagen wird, ist die integrierten Funktionen isinstance() und issubclass zu ermöglichen Überlastung(). Das Überladen funktioniert wie folgt: Der Aufruf isinstance (x, C) prüft zuerst, ob C.__instancecheck__
existiert, und wenn ja, ruft C.__instancecheck__(x)
anstelle seiner normalen Implementierung.
Sie schreiben:
class C:
def do_stuff(self):
print('hello')
C.do_stuff(C())
So basiert auf dem Zitat oben vom PEP, sollten Sie in der Lage sein
class C:
@classmethod
def __instancecheck__(cls, x):
print('hello')
C.__instancecheck__(C())
--output:--
hello
Aber isinstance() nicht nennen diese Methode zu schreiben:
class C:
@classmethod
def __instancecheck__(cls, y):
print('hello')
x = C()
isinstance(x, C)
--output:--
<nothing>
Die PEP geht dann zu sagen:
Diese Methoden bestimmt, deren metaclass auf Klassen aufgerufen werden, werden wird (abgeleitet von) ABCMeta ...
Okay, lassen wir das versuchen:
import abc
class MyMeta(abc.ABCMeta): #A metaclass derived from ABCMeta
def __instancecheck__(cls, inst):
print('hello')
return True
class C(metaclass=MyMeta): #A class whose metaclass is derived from ABCMeta
pass
x = C()
C.__instancecheck__(x)
--output:--
hello
Aber noch einmal isinstance() ruft diese Methode nicht auf:
isinstance(x, C)
--output:--
<nothing>
Fazit: PE P 3119 muss neu geschrieben werden - zusammen mit den "Datenmodell" -Dokumenten.
Dies ist verwandt mit (aber kein Duplikat): http://StackOverflow.com/Questions/13135712/Class-Method-Instancecheck-does-Not-Work – dnozay