Στην Python, οι ενσωματωμένες συναρτήσεις type() και isinstance() χρησιμοποιούνται για να λαμβάνετε και να ελέγχετε τον τύπο ενός αντικειμένου, όπως μια μεταβλητή, και για να προσδιορίζετε αν είναι συγκεκριμένου τύπου.
- class type(object) — Built-in Functions — Python 3.10.4 Documentation
- isinstance(object, classinfo) — Built-in Functions — Python 3.10.4 Documentation
Τα ακόλουθα περιεχόμενα εξηγούνται εδώ, μαζί με παράδειγμα κώδικα.
- Λήψη και έλεγχος τύπου αντικειμένου:
type()
- Προσδιορισμός του τύπου του αντικειμένου:
type()
,isinstance()
- Προσδιορισμός τύπου με χρήση της type()
- Προσδιορισμός τύπου με χρήση της isinstance()
- Διαφορά μεταξύ type() και isinstance()
Αντί για τον προσδιορισμό του τύπου ενός αντικειμένου, μπορεί κανείς να χρησιμοποιήσει το χειρισμό εξαιρέσεων ή την ενσωματωμένη συνάρτηση hasattr() για να προσδιορίσει αν ένα αντικείμενο διαθέτει τις σωστές μεθόδους και χαρακτηριστικά.
Λήψη και έλεγχος τύπου αντικειμένου: type()
Η type(object) είναι μια συνάρτηση που επιστρέφει τον τύπο του αντικειμένου που περνάει ως όρισμα. Μπορεί να χρησιμοποιηθεί για να μάθετε τον τύπο ενός αντικειμένου.
print(type('string'))
# <class 'str'>
print(type(100))
# <class 'int'>
print(type([0, 1, 2]))
# <class 'list'>
Η τιμή επιστροφής της type() είναι ένα αντικείμενο τύπου, όπως str ή int.
print(type(type('string')))
# <class 'type'>
print(type(str))
# <class 'type'>
Προσδιορισμός του τύπου του αντικειμένου: type(), isinstance()
Χρησιμοποιήστε την type() ή την isinstance() για να προσδιορίσετε τον τύπο.
Προσδιορισμός τύπου με χρήση της type()
Συγκρίνοντας την τιμή επιστροφής της type() με έναν αυθαίρετο τύπο, μπορεί να προσδιοριστεί αν το αντικείμενο είναι οποιουδήποτε τύπου.
print(type('string') is str)
# True
print(type('string') is int)
# False
def is_str(v):
return type(v) is str
print(is_str('string'))
# True
print(is_str(100))
# False
print(is_str([0, 1, 2]))
# False
Αν θέλετε να προσδιορίσετε αν πρόκειται για έναν από πολλούς τύπους, χρησιμοποιήστε τον τελεστή in και μια πλειάδα ή μια λίστα πολλών τύπων.
def is_str_or_int(v):
return type(v) in (str, int)
print(is_str_or_int('string'))
# True
print(is_str_or_int(100))
# True
print(is_str_or_int([0, 1, 2]))
# False
Είναι επίσης δυνατό να ορίσετε συναρτήσεις που αλλάζουν την επεξεργασία ανάλογα με τον τύπο του ορίσματος.
def type_condition(v):
if type(v) is str:
print('type is str')
elif type(v) is int:
print('type is int')
else:
print('type is not str or int')
type_condition('string')
# type is str
type_condition(100)
# type is int
type_condition([0, 1, 2])
# type is not str or int
Προσδιορισμός τύπου με χρήση της isinstance()
isinstance(object, class) είναι μια συνάρτηση που επιστρέφει true αν το αντικείμενο του πρώτου ορίσματος είναι παράδειγμα του τύπου ή της υποκλάσης του δεύτερου ορίσματος.
Το δεύτερο όρισμα μπορεί να είναι μια πλειάδα τύπων. Εάν είναι μια περίπτωση ενός από τους δύο τύπους, επιστρέφεται true.
print(isinstance('string', str))
# True
print(isinstance(100, str))
# False
print(isinstance(100, (int, str)))
# True
Μια συνάρτηση παρόμοια με το παράδειγμα του προσδιορισμού τύπου με τη χρήση της type() μπορεί να γραφτεί ως εξής
def is_str(v):
return isinstance(v, str)
print(is_str('string'))
# True
print(is_str(100))
# False
print(is_str([0, 1, 2]))
# False
def is_str_or_int(v):
return isinstance(v, (int, str))
print(is_str_or_int('string'))
# True
print(is_str_or_int(100))
# True
print(is_str_or_int([0, 1, 2]))
# False
def type_condition(v):
if isinstance(v, str):
print('type is str')
elif isinstance(v, int):
print('type is int')
else:
print('type is not str or int')
type_condition('string')
# type is str
type_condition(100)
# type is int
type_condition([0, 1, 2])
# type is not str or int
Διαφορά μεταξύ type() και isinstance()
Η διαφορά μεταξύ της type() και της isinstance() είναι ότι η isinstance() επιστρέφει true για τις περιπτώσεις υποκλάσεων που κληρονομούν την κλάση που καθορίζεται ως δεύτερο όρισμα.
Για παράδειγμα, ορίζονται η ακόλουθη υπερκλάση (βασική κλάση) και υποκλάση (παράγωγη κλάση)
class Base:
pass
class Derive(Base):
pass
base = Base()
print(type(base))
# <class '__main__.Base'>
derive = Derive()
print(type(derive))
# <class '__main__.Derive'>
Ο προσδιορισμός τύπου με τη χρήση της type() επιστρέφει true μόνο όταν οι τύποι ταιριάζουν, αλλά η isinstance() επιστρέφει true ακόμα και για υπερκλάσεις.
print(type(derive) is Derive)
# True
print(type(derive) is Base)
# False
print(isinstance(derive, Derive))
# True
print(isinstance(derive, Base))
# True
Ακόμα και για τους τυπικούς τύπους, για παράδειγμα, τον boolean τύπο bool (true,false), πρέπει να δοθεί προσοχή.Ο bool είναι υποκλάση του τύπου integer, οπότε η isinstance() επιστρέφει true ακόμα και για έναν int από τον οποίο έχει κληρονομηθεί.
print(type(True))
# <class 'bool'>
print(type(True) is bool)
# True
print(type(True) is int)
# False
print(isinstance(True, bool))
# True
print(isinstance(True, int))
# True
Αν θέλετε να προσδιορίσετε τον ακριβή τύπο, χρησιμοποιήστε την type().Αν θέλετε να προσδιορίσετε τον τύπο λαμβάνοντας υπόψη την κληρονομικότητα, χρησιμοποιήστε την isinstance().
Η ενσωματωμένη συνάρτηση issubclass() παρέχεται επίσης για να προσδιορίσετε αν μια κλάση είναι υποκλάση μιας άλλης κλάσης.
print(issubclass(bool, int))
# True
print(issubclass(bool, float))
# False