Penso che il PEP descrive __instancecheck__()
è difettoso. PEP 3119 afferma:
Il meccanismo principale qui proposto è quello di consentire di sovraccaricare il funzioni integrate isinstance() e issubclass(). L'overloading funziona come segue: La chiamata isinstance (x, C) controlla innanzitutto se esiste C.__instancecheck__
e, in tal caso, chiama C.__instancecheck__(x)
invece della sua normale implementazione.
È possibile scrivere:
class C:
def do_stuff(self):
print('hello')
C.do_stuff(C())
Quindi, sulla base della citazione di cui sopra dal PEP, si dovrebbe essere in grado di scrivere
class C:
@classmethod
def __instancecheck__(cls, x):
print('hello')
C.__instancecheck__(C())
--output:--
hello
Ma isinstance() non chiama questo metodo:
class C:
@classmethod
def __instancecheck__(cls, y):
print('hello')
x = C()
isinstance(x, C)
--output:--
<nothing>
Il PEP prosegue dicendo:
Questi metodi sono destinati ad essere chiamato in classi i cui metaclasse è (derivato da) ABCMeta ...
Va bene, proviamo che:
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
Ma ancora una volta isinstance() non chiama questo metodo:
isinstance(x, C)
--output:--
<nothing>
Conclusione: PE P 3119 deve essere riscritto - insieme ai documenti "Modello dati".
questo è correlato a (ma non a un duplicato): http://stackoverflow.com/questions/13135712/class-method-instancecheck-does-not-work – dnozay