Ποιες είναι οι διαφορές μεταξύ αυτών των δύο τμημάτων κώδικα;
Χρήση της type()
:
import types
if type(a) is types.DictType:
do_something()
if type(b) in types.StringTypes:
do_something_else()
Χρήση της isinstance()
:
if isinstance(a, dict):
do_something()
if isinstance(b, str) or isinstance(b, unicode):
do_something_else()
Εδώ είναι ένα παράδειγμα όπου το isinstance
επιτυγχάνει κάτι που το type
δεν μπορεί:
class Vehicle:
pass
class Truck(Vehicle):
pass
σε αυτή την περίπτωση, ένα αντικείμενο φορτηγού είναι ένα όχημα, αλλά θα λάβετε αυτό:
isinstance(Vehicle(), Vehicle) # returns True
type(Vehicle()) == Vehicle # returns True
isinstance(Truck(), Vehicle) # returns True
type(Truck()) == Vehicle # returns False, and this probably won't be what you want.
Με άλλα λόγια, το isinstance
είναι αληθές και για τις υποκλάσεις.
Δείτε επίσης: <https://stackoverflow.com/q/707674/1341006>,
Η τελευταία προτιμάται, επειδή θα χειρίζεται σωστά τις υποκλάσεις. Στην πραγματικότητα, το παράδειγμά σας μπορεί να γραφτεί ακόμα πιο εύκολα επειδή η δεύτερη παράμετρος της isinstance()
'μπορεί να είναι μια πλειάδα:
if isinstance(b, (str, unicode)):
do_something_else()
ή, χρησιμοποιώντας την αφηρημένη κλάση basesring
:
if isinstance(b, basestring):
do_something_else()
Σύμφωνα με την τεκμηρίωση της python εδώ είναι μια δήλωση:
8.15. types - Ονόματα για ενσωματωμένους τύπους
Από την Python 2.2, οι ενσωματωμένοι τύποι εργοστασιακές συναρτήσεις, όπως η
int()
και ηstr()
είναι επίσης ονόματα για τις αντίστοιχους τύπους.
Έτσι, η isinstance()
θα πρέπει να προτιμάται από την type()
.