Kısaca cevaplamak gerekirse, isinstance
miras (inheritance) için de hizmet verir (türetilmiş herhangi bir sınıfın kopyası da bir baz (base) sınıfının kopyasıdır), ancak tür eşitliğini kontrol eden type
bunu yapmaz (türlerin kimliğine bakar ve üst sınıfları değerlendirmez).
Normalde, Python’da kodunuzun mirası desteklemesini istersiniz. Bu yüzden isinstance
kimlik kontrolü yapan type
fonksiyonundan daha az kötüdür. Sorunsuz bir şekilde mirası destekler.
Dikkat edin: söylediğimiz şey isinstance
‘ın iyi olduğu değil, type
‘tan (sadece kimlik kontrolü yapmaktan) daha az kötü olduğu. Normalde şu yolu tercih ederiz: kullanmak istediğimiz argümanı sanki istediğimiz türdenmiş gibi kullanmayı deneriz; argüman istediğimiz türde değilse ortaya çıkabilecek tüm istisnaları yakalayan bir try/except
ifadesi kurarız. except
kısmında ise başka bir türdeymiş gibi işlem yaparız.
basestring
ne işe yarar?
Ancak, basestring
sayesinde isinstance
için oldukça özel bir durum bulunur – basestring
, isinstance
‘ı kullanmanıza izin veren yerleşik bir türdür (hem str
hem de unicode
basestring
‘in alt sınıfıdır). String bir dizidir (string üzerinde döngü yapabilir, indeksleyebilir, dilimleyebiliriz, vs), ve genellikle bunları “skaler” türler olarak ele almak isteriz. Ancak bazı dizi türlerini (string) bir şekilde değerlendirirken, diğer dizi türlerini (list, set, dict, …) başka şekilde değerlendirmek pek doğru bir yöntem değil. Bu durumda basestring
ve isinstance
bize yardımcı olur. Genel yapı şu şekilde işler;
if isinstance(x, basestring)
return skalargibidegerlendir(x)
try:
return dongugibidegerlendir(dongu(x))
except TypeError:
return skalargibidegerlendir(x)
basestring
‘in bir soyut baz class’ı (“sbc”) olduğunu söyleyebilirsiniz – çünkü alt sınıflar için somut bir işlevsellik sunmaz ve esas olarak isinstance
‘ın kullanımı için bir araç olarak bulunur. Ama, PEP3119’da kabul edildiğinden ve Python 2.6 ve 3.0’dan başlayarak uygulamaya konulduğundan beri bu kavram Python’da oldukça büyüyen bir yer edindiğini de unutmamak gerekir.
Mesela isinstance
‘in yapabileceği ama type
‘ın yapamayacağı bir örnek aşağıdaki gibi olabilir:
class Arac:
..
class Kamyon(Arac):
..
bu durumda, kamyon nesnesi bir Araçtır, ancak aşağıdaki gibi bir sonuç elde ederiz:
isinstance(Arac(), Arac) # True
type(Arac()) == Arac # True
isinstance(Kamyon(), Arac) # True
type(Kamyon()) == Arac # False, ve bu muhtemelen istediğimiz bir sonuç değil.
Başka bir deyişle, isinstance
alt sınıflar için de geçerli olur.