koddla

Yazılımcıları bilgi ile güçlendirir.

Python’da type() ve isinstance() arasındaki farklar nelerdir?

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.

Bir yanıt yazın

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir

Back to top