type(), isinstance() για να λάβετε και να προσδιορίσετε τον τύπο στην Python

Επιχείρηση

Στην Python, οι ενσωματωμένες συναρτήσεις type() και isinstance() χρησιμοποιούνται για να λαμβάνετε και να ελέγχετε τον τύπο ενός αντικειμένου, όπως μια μεταβλητή, και για να προσδιορίζετε αν είναι συγκεκριμένου τύπου.

Τα ακόλουθα περιεχόμενα εξηγούνται εδώ, μαζί με παράδειγμα κώδικα.

  • Λήψη και έλεγχος τύπου αντικειμένου: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