1565 Stimmen

Was sind die Unterschiede zwischen type() und isinstance()?

Was sind die Unterschiede zwischen diesen beiden Codefragmenten?

Verwendung von type() :

import types

if type(a) is types.DictType:
    do_something()
if type(b) in types.StringTypes:
    do_something_else()

Verwendung von isinstance() :

if isinstance(a, dict):
    do_something()
if isinstance(b, str) or isinstance(b, unicode):
    do_something_else()

6 Stimmen

Hinweis:Wenn es sich nicht um str y unicode (wo Sie einfach überprüfen können basestring ), können Sie ein Tupel für die Prüfung auf mehrere Typen verwenden. Um zu prüfen, ob something es int o str 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 (wie type(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.

15voto

Xinus Punkte 28201

Gemäß der Python-Dokumentation ist hier eine Anweisung:

8.15. types - Namen für eingebaute Typen

Ab Python 2.2 können eingebaute Werksfunktionen wie int() et str() sind auch Namen für die entsprechenden Typen.

Also isinstance() sollte vorgezogen werden gegenüber type() .

1voto

Cheney Punkte 890

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 )

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X