Isinstance() ile type() farkı

lütfen söyleyin bu ikisi arasındaki fark ne

Yaptığın bir programda farzedelim kullanıcıdan bir değer alıcaksınız, int veya str olduğunu isinstance ile öğrenip if-elif bloklarında kullanabilirsin. Ama type metodunu kullanamazsın bu bloklarda. Ancak iç içe geçmiş verilerin tipini veya herhangi bir veri tipini öğrenebilirsin type ile örneğin int-str-set-frozenset-list-tuple gibi

Ufak örnekler ile daha iyi anlaşılır umuyorum,


def verial(veri):
	if isinstance(veri, int):#eğer veri intiger ise
		print(veri + veri)
	elif isinstance(veri, str):#eğer veri string ise
		print("string türünde veri girdiniz...")
	else:#eğer başka bir veri tipi ise
		print("girdiğiniz veri tipi : ", type(veri))

verial(1)#intiger ise kendisiyle toplicak
verial("e")#string deniyelim
verial([1])#liste veya başka bir veri tipi

demek istiyorsun ki isinstance bool değeri döndürürken
type girdiğin argümanın tipini döndürüyor.

Peki isinstance ’ yi sınıflarlada kullanabilirmiyiz
mesela:
class a:
pass
class b(a):
pass
if isinstance(b,a):
print(“something”)

Yazdığınız kodlardan bişi anlaşılmıyo lütfen şu linke göz atın Gönderilerdeki kod görünümü hakkında

Tabiki classlarlada kullanabilirsiniz

Onun icin issubtype var. Ama bunlari kullanmak buyuk ihtimalle yanlis (=olmasi gerektiginden fazla komplike) koda yol acacak.

1 Beğeni

@aib Bey, forum taşınmadan önce bir yorumunuz vardı. Ben de size o yorumunuz ile alakalı tam anlamadığım bir yeri sormuştum ancak siz göremeden forum taşındı sanırım. Kodunuzda bir yazılım prensibinden bahsetmiştiniz. İsmini hatırlamıyorum ancak alt sınıfların nesnelerinin, miras alınan sınıfın nesnelerinin yapabileceği her şeyi yapması gerektiği ile alakalı idi. Sanırım bu yüzden de type kullanmanın yanlış olduğunu, çünkü isinstance yerine type kullanmamızı gerektirecek bir durumun bulunmaması gerektiğini söylemiştiniz. Doğru anlamış mıyım?

@EkremDincel Liskov Substitution Principle; X beklenen yere X’in alt sinifini verdigimizde de duzgun calismali diye ozetleyebilecegim bir prensip.

Inheritance ile calisan isinstance/issubtype varken type ==/is kullanmak bunu kiriyor. Siniflari gereksiz yere inherit edilemez/subtype’lanamaz yapiyor.

Fakat isinstance/issubtype’la bile yapilsa type kontrolu yapmak (ad-hoc polymorphism) yanlis. Soyle bir ornek vermistim sanirim:

  if isinstance(actor, Enemy):
# if issubtype(type(actor), Enemy):
# if type(actor) is Enemy:
    actor.hurt(player)

yerine

  if actor.can_hurt(player)
# if actor.is_enemy()
    actor.hurt(player)

Yani sinifin ne oldugundansa ne yapabildigine, nasil davrandigina bakmak lazim.

Python’da bunun en ileri ornegi olan duck typing var; actor uzerinde en ufak bir kontrol yapmadan dogrudan actor.hurt cagrilabiliyor, bu yanlis bir seyse hata runtime’da aliniyor.

Python’da ad-hoc polymorphism’in gerektigi veya gerekebilecegi yer parametre turu/sayisi uzerinden overloading. Ona da indent(amount_or_char='\t') ornegi vermistim sanirim; sayi gelirse o kadar space, karakter gelirse o karakter ile indent eden bir fonksiyon parametrenin sayi olup olmadigina bakmak zorunda.

1 Beğeni

Teşekkür ederim. …