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: https://stackoverflow.com/q/707674/1341006
İ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()
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ı vestr()
aynı zamanda karşılık gelen tipler.
Bu nedenle isinstance()
, type()
yerine tercih edilmelidir.