O zaman şöyle anlatıyorum.
Önce kendim örnek bir kod yazayım onun üstünden sana "self, __init__(), super().__init__()" terimlerini anlatayım. Hem verdiğim örneklerden daha rahat anlayabilirsin. Yine uzun bir yazı olabilir.
[CODE lang="python" title="Kalıtım örneği (Parent-child)"]class HomoSapiens:
def __init__(self,isim):
self.isim = isim # "self.<rastgele_değişken_ismi> = parametre"
if self.yürüyebilen(): # dönen "durum" değişkeni True ise.
print(f"{self.isim} isminde özel karakter olduğundan bu kişi yürüyemez")
else: # dönen "durum" değişkeni False ise.
print("İşte gerçek bir insan")
def yürüyebilen(self): # yürüyebilen adında bir method yani fanksiyon oluşturdum.
durum = False # durum değişkeni oluşturdum ve False(bool) değerini atadım.
for i in "><£#$½{[]}\\": # tırnak içinde belirlenen karakterler içerisinde dolanan i değişkeni tanımlandı.
if i in self.isim: # eğer i değişkeni sınıfa verilen parametreye girilen argumanda var ise.
durum = True # durum değişkeninin değerini True olarak değiştiriyorum.
else: # eğer i değişkeni sınıfa verilen parametreye girilen argumanda yoksa.
durum # durum değişkenini aynen korusun yani False değeri hala kalmaya devam etsin.
return durum # üstteki işlemlere göre de durum değişkeninin değerini fonksiyon da döndürsün.
class ModernInsan(HomoSapiens): # HomoSapiens sınıfından miras alıyoruz.
def __init__(self, isim): #child sınıfımıza bir arguman verileceğinden bir parametre oluşturuyoruz.
self.konuşan_insan = isim # "self.<rastgele_değişken_ismi> = parametre"
super().__init__(isim) # super() sınıfı yani Oluşturduğumuz Miras aldığımız "HomoSapiens" sınıfının __init__() methodunu alıyoruz.
# böylece ModernInsan sınıfını kullanırken verdiğimiz parametreler arkada dönen ebeveyn sınıfta işlemlerin gerçekleşirmesini salamış oluyor.
ModernInsan("Arif")
ModernInsan("A[]rif><")[/CODE]
>>>İşte gerçek bir insan
>>>A[]rif>< isminde özel karakter olduğundan bu kişi yürüyemez
Burada HomoSapiens
sınıfı oluşturdum.
ModernInsan
sınıfında kullandığımız gibi bir kalıtım yaparak kullanacaksak o bilinçle ebeveyn sınıfı yazılıyor.
Yazılan bu sınıfta __init__()
methodu, yazılan sınıf en alttaki gibi çağrılıp belirlenen parametre verildiğinde ilk olarak çalışan method oluyor.(önemli olan init methodu sınıf oluşturulduğunda çalışan ilk method olduğu bilinci)
İlk parametre “self
” olmak zorunda değil, ama ilk parametre her zaman belirlenen “bir şey
” olmak zorunda. İlk parametre kullanılarak oluşturulan değişkenler diğer bir adı ile, sınıfta türetilen nesneler, diğer methodlar tarafından da erişilebilmesi adına belirlediğimiz parametre ile yazılarak değişken/alan(field) oluşturuluyor. Farkındaysan HomoSapiens
sınıfının __init__
methodunda yer alan isim parametresini, self kullanarak parametrenin taşıdığı ismin aynısını veriyorum. Burada farklılık olabilir elbette(örneğin self.ad = isim).
ama kafa karışıklığını gidermek adına türetilen nesne ismi ile __init__
methoduna verilen parametre isimleri genelde aynı oluyor.
ModernInsan
sınfında ise göreceksiniz ki HomoSapiens
sınıfını miras almış.
Bu demek oluyor ki miras sınıfna ait olan kullanılmak üzere oluşturulmuş olan bütün methodlara.
ModernInsan
sınıfı içerisinde ulaşabiliyoruz.
Gördüğün üzere ModernInsan
sınıfının __init__
metoduda bir isim adında parametre alıyor.
Aynı parametreyi (yine sınıf içerisinde farklı methodlar içinde kullanacağımı düşündüğümden)
self anahtar kelimesi ile türetip bunu __init__
methodundaki isim parametresine atıyorum.
Peki bu atanan değişkeni ebeveyn sınıfta nasıl kullanacağım?
Burada da şöyle bir olay gerçekleşiyor:
super()
adıyla bilinen sınıf, ebeveyn olarak kullandığımız sınıfın ta kendisi olmuş oluyor.
Yani ben diyorum ki burada "HomoSapiens
sınıfının __init__
methoduna, ModernInsan
sınıfında oluşturulan __init__
metodunun isim adlı parametresinin aldığı arguman(girilen veri/değer) kullanılsın"
Edit:
Burada oluşturduğum örnekte child sınıfa ayrıyeten yazılmış methodlar bulunmamakta bu da şunun göstergesi; üzerine fazladan özellik eklemeyeceğimiz sınıflarda miras almanın pek bir anlamı olmadığını söylüyor.
Fakat şöyle bir düzenleme yapıp child sınıfımıza yani modernınsan sınıfımıza özgü bir fonksiyon yani method oluşturalım:
[CODE lang="python" title="Kalıtım örneği (Parent-child) ~ Child eklenen method" highlight="24-25,30"]class HomoSapiens:
def __init__(self,isim):
self.isim = isim # "self.<rastgele_değişken_ismi> = parametre"
if self.yürüyebilen(): # dönen "durum" değişkeni True ise.
print(f"{self.isim} isminde özel karakter olduğundan bu kişi yürüyemez")
else: # dönen "durum" değişkeni False ise.
print("İşte gerçek bir insan")
def yürüyebilen(self): # yürüyebilen adında bir method yani fanksiyon oluşturdum.
durum = False # durum değişkeni oluşturdum ve False(bool) değerini atadım.
for i in "><£#$½{[]}\\": # tırnak içinde belirlenen karakterler içerisinde dolanan i değişkeni tanımlandı.
if i in self.isim: # eğer i değişkeni sınıfa verilen parametreye girilen argumanda var ise.
durum = True # durum değişkeninin değerini True olarak değiştiriyorum.
else: # eğer i değişkeni sınıfa verilen parametreye girilen argumanda yoksa.
durum # durum değişkenini aynen korusun yani False değeri hala kalmaya devam etsin.
return durum # üstteki işlemlere göre de durum değişkeninin değerini fonksiyon da döndürsün.
class ModernInsan(HomoSapiens): # HomoSapiens sınıfından miras alıyoruz.
def __init__(self, isim): #child sınıfımıza bir arguman verileceğinden bir parametre oluşturuyoruz.
self.konuşan_insan = isim # "self.<rastgele_değişken_ismi> = parametre"
super().__init__(isim) # super() sınıfı yani Oluşturduğumuz Miras aldığımız "HomoSapiens" sınıfının __init__() methodunu alıyoruz.
# böylece ModernInsan sınıfını kullanırken verdiğimiz parametreler arkada dönen ebeveyn sınıfta işlemlerin gerçekleşirmesini salamış oluyor.
def konuşabilen(self):
print(f"{self.konuşan_insan} konuşabilen modern bir insandır")
ModernInsan("Arif")
ModernInsan("A[]rif><")
ModernInsan("Arif").konuşabilen()[/CODE]