Die tatsächlichen Unterschiede finden wir in code
, aber ich kann die Implementierung des Standardverhaltens der isinstance()
.
Wir können jedoch eine ähnliche Lösung finden abc.__instancecheck__ laut __instancecheck__ .
Von oben abc.__instancecheck__
nach Anwendung des nachstehenden Tests:
# file tree
# /test/__init__.py
# /test/aaa/__init__.py
# /test/aaa/aa.py
class b():
pass
# /test/aaa/a.py
import sys
sys.path.append('/test')
from aaa.aa import b
from aa import b as c
d = b()
print(b, c, d.__class__)
for i in [b, c, object]:
print(i, '__subclasses__', i.__subclasses__())
print(i, '__mro__', i.__mro__)
print(i, '__subclasshook__', i.__subclasshook__(d.__class__))
print(i, '__subclasshook__', i.__subclasshook__(type(d)))
print(isinstance(d, b))
print(isinstance(d, c))
<class 'aaa.aa.b'> <class 'aa.b'> <class 'aaa.aa.b'>
<class 'aaa.aa.b'> __subclasses__ []
<class 'aaa.aa.b'> __mro__ (<class 'aaa.aa.b'>, <class 'object'>)
<class 'aaa.aa.b'> __subclasshook__ NotImplemented
<class 'aaa.aa.b'> __subclasshook__ NotImplemented
<class 'aa.b'> __subclasses__ []
<class 'aa.b'> __mro__ (<class 'aa.b'>, <class 'object'>)
<class 'aa.b'> __subclasshook__ NotImplemented
<class 'aa.b'> __subclasshook__ NotImplemented
<class 'object'> __subclasses__ [..., <class 'aaa.aa.b'>, <class 'aa.b'>]
<class 'object'> __mro__ (<class 'object'>,)
<class 'object'> __subclasshook__ NotImplemented
<class 'object'> __subclasshook__ NotImplemented
True
False
Ich komme zu diesem Schluss, Für type
:
# according to `abc.__instancecheck__`, they are maybe different! I have not found negative one
type(INSTANCE) ~= INSTANCE.__class__
type(CLASS) ~= CLASS.__class__
Para isinstance
:
# guess from `abc.__instancecheck__`
return any(c in cls.__mro__ or c in cls.__subclasses__ or cls.__subclasshook__(c) for c in {INSTANCE.__class__, type(INSTANCE)})
BTW: besser nicht mischen verwenden relative and absolutely import
verwenden absolutely import
von project_dir( hinzugefügt von sys.path
)
6 Stimmen
Hinweis:Wenn es sich nicht um
str
yunicode
(wo Sie einfach überprüfen könnenbasestring
), können Sie ein Tupel für die Prüfung auf mehrere Typen verwenden. Um zu prüfen, obsomething
esint
ostr
verwenden.isinstance(something, (int, str))
.2 Stimmen
type()
gibt den Typ des Objekts zurück, das Sie als Argument angegeben haben, und ist normalerweise nicht nützlich, es sei denn, es wird mit einem realen Typ verglichen (wietype(9) == int
).isinstance()
gibt einen booleschen Wert - true oder false - zurück, je nachdem, ob das Objekt vom angegebenen Typ ist.isinstance
ist in den meisten Fällen eleganter zu verwenden als eine umständliche Gleichheitsprüfung zu schreiben.