type() ve isinstance() arasındaki farklar nelerdir?

Bu iki kod parçası arasındaki farklar nelerdir? type()` kullanarak:

import types

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

isinstance()` kullanımı:

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

İşte isinstanceın typeın başaramadığı bir şeyi başardığı bir örnek:

class Vehicle:
    pass

class Truck(Vehicle):
    pass

Bu durumda, bir kamyon nesnesi bir Araçtır, ancak bunu alacaksınız:

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.

Başka bir deyişle, isinstance alt sınıflar için de doğrudur.

Ayrıca bakınız:

Yorumlar (6)

İkincisi tercih edilir, çünkü alt sınıfları düzgün bir şekilde işleyecektir. Aslında, örneğiniz daha da kolay yazılabilir çünkü isinstance()'ın ikinci parametresi bir tuple olabilir:

if isinstance(b, (str, unicode)):
    do_something_else()

veya basestring soyut sınıfını kullanarak:

if isinstance(b, basestring):
    do_something_else()
Yorumlar (0)

Python belgelerine göre burada bir ifade var:

8.15. tipler - Yerleşik tipler için isimler

Python 2.2'den başlayarak, yerleşik int() gibi fabrika fonksiyonları ve str() aynı zamanda karşılık gelen tipler.

Bu nedenle isinstance(), type() yerine tercih edilmelidir.

Yorumlar (0)