Python self, __init__ tam olarak nedir, ne işe yarar?

"Self" ve "__init__" class'ın temelidir. Direkt python'dan başladıysan kodlamaya Object oriented kısımda kafan karışmış muhtemelen. Class dediğimiz şey nedir? Class kendi oluşturduğun bir veri yapısıdır. Python'da veri yapıları da yok ancak :D Yani var da arka planda çalışıyor sen görmüyorsun. Kısa özet şu, classlar içlerinde birden fazla veri yapısı tutabilirler.
Örnek: Mesela bir "ülke" classın olsun. Bu classın içinde;
Metin olarak (string) bir "ülke ismi" tutabilirsin,
Sayı olarak bir"şehir sayısı" tutabilirsin,
Yine metin olarak (string) bir "başkent" tutabilirsin.
Yani birden fazla veri tutabileceğin için "a = türkiye" gibi bir şey yapamazsın. Öncelikle constructor'ın anlamını bilmen lazım. Constructor inşa eden demek. Yani özel verisi yapısı olduğu için onu inşa edendir. Yani özel veri yapını inşa eden fonksiyondur. Her classın içinde mutlaka bir "__init__" vardır ve bu classı inşa eder. Sen "__init__" fonksiyonu yazmasan bile gizli boş bir "__init__" fonksiyonu vardır ve classın içindeki tüm değerlere null atar. (Bazı dillerde atmaya da biliyor :D O yüzden tanımlamak önemli)
Bir classın adının yanına parantez açtığın zaman o classın constructor methodunu çağırıyorsun demek. Yani "__init__"ini. Daha da yani şöyle tanımlama yapman gerekiyor.
a = ülke()
Şimdi sen "a" adında bir ülke veri yapısı tanımladın. Bunun ismi, başkenti ve şehir sayısı null atandı. Yani boş. Hiçbir işe yaramaz, ya da elle tek tek girmen lazım. Nasıl mı? Şöyle.
a.ülkeİsmi = "türkiye"
a.sehirSayisi = 81
a.baskent = "ankara"
gibi. İşte bunla tek tek uğraşmamak için (Ve genelde classın verileri korunur. Bunu java öğrenmeye çalışırsan göreceksin) kendi constructor methodumuzu tanımlıyoruz. Mesela ülke classının içinde şöyle bir contructor fonksiyonu olsaydı;
def __init__(self, isim, sehirSayisi, baskent):
self.ülkeİsmi = isim
self.sehirSayisi = sehirSayisi
self.baskent = baskent
Not : eşitliğin sağ tarafı fonksiyonun parametreleridir. Sol tarafı ise classın içine tanımladığın veriler.
Böyle bir constructor methodu ile her şeyi daha hızlı tanımlayabilirdik. Constructor classımız self hariç 3 veri alıyor. Yani ülkeyi şöyle oluşturacaktık bu sefer;
a = ülke("türkiye",81,"ankara")
hop bitti.

Şimdi self'e gelelim. Yukarıda da gördüğün gibi, classın kendi veri isimleriyle classın fonksiyonlarının aldığı veri isimlerinin aynı olması durumunda (ki genelde contructor method'da aynı isimleri kullanırız bizden sonra okuyan kişi daha kolay anlasın diye) "self"i kullanıyoruz. Self nedir, kısaca benim demek. self.baskent dediğin zaman, benim başkenti değerim demek. baskent dediğin zaman varsa fonksiyon parametrelerindeki başkent demek. O yüzden self kullanıyoruz.
self.baskent = baskent gibi. Fonksiyon parametresi olan başkenti, benim içimdeki veri yapısı olan başkente ata şeklinde.





En başta kısaca dedim, daha uzun yazmak gibi bir amacım vardı :D ama saat gece 3 olmuş ve vaktim yok daha fazla. Sorun olursa mesaj atabilirsin.
 
"Self" ve "__init__" class'ın temelidir. Direkt python'dan başladıysan kodlamaya Object oriented kısımda kafan karışmış muhtemelen. Class dediğimiz şey nedir? Class kendi oluşturduğun bir veri yapısıdır. Python'da veri yapıları da yok ancak :D Yani var da arka planda çalışıyor sen görmüyorsun. Kısa özet şu, classlar içlerinde birden fazla veri yapısı tutabilirler.
Örnek: Mesela bir "ülke" classın olsun. Bu classın içinde;
Metin olarak (string) bir "ülke ismi" tutabilirsin,
Sayı olarak bir"şehir sayısı" tutabilirsin,
Yine metin olarak (string) bir "başkent" tutabilirsin.
Yani birden fazla veri tutabileceğin için "a = türkiye" gibi bir şey yapamazsın. Öncelikle constructor'ın anlamını bilmen lazım. Constructor inşa eden demek. Yani özel verisi yapısı olduğu için onu inşa edendir. Yani özel veri yapını inşa eden fonksiyondur. Her classın içinde mutlaka bir "__init__" vardır ve bu classı inşa eder. Sen "__init__" fonksiyonu yazmasan bile gizli boş bir "__init__" fonksiyonu vardır ve classın içindeki tüm değerlere null atar. (Bazı dillerde atmaya da biliyor :D O yüzden tanımlamak önemli)
Bir classın adının yanına parantez açtığın zaman o classın constructor methodunu çağırıyorsun demek. Yani "__init__"ini. Daha da yani şöyle tanımlama yapman gerekiyor.
a = ülke()
Şimdi sen "a" adında bir ülke veri yapısı tanımladın. Bunun ismi, başkenti ve şehir sayısı null atandı. Yani boş. Hiçbir işe yaramaz, ya da elle tek tek girmen lazım. Nasıl mı? Şöyle.
a.ülkeİsmi = "türkiye"
a.sehirSayisi = 81
a.baskent = "ankara"
gibi. İşte bunla tek tek uğraşmamak için (Ve genelde classın verileri korunur. Bunu java öğrenmeye çalışırsan göreceksin) kendi constructor methodumuzu tanımlıyoruz. Mesela ülke classının içinde şöyle bir contructor fonksiyonu olsaydı;
def __init__(self, isim, sehirSayisi, baskent):
self.ülkeİsmi = isim
self.sehirSayisi = sehirSayisi
self.baskent = baskent
Not : eşitliğin sağ tarafı fonksiyonun parametreleridir. Sol tarafı ise classın içine tanımladığın veriler.
Böyle bir constructor methodu ile her şeyi daha hızlı tanımlayabilirdik. Constructor classımız self hariç 3 veri alıyor. Yani ülkeyi şöyle oluşturacaktık bu sefer;
a = ülke("türkiye",81,"ankara")
hop bitti.

Şimdi self'e gelelim. Yukarıda da gördüğün gibi, classın kendi veri isimleriyle classın fonksiyonlarının aldığı veri isimlerinin aynı olması durumunda (ki genelde contructor method'da aynı isimleri kullanırız bizden sonra okuyan kişi daha kolay anlasın diye) "self"i kullanıyoruz. Self nedir, kısaca benim demek. self.baskent dediğin zaman, benim başkenti değerim demek. baskent dediğin zaman varsa fonksiyon parametrelerindeki başkent demek. O yüzden self kullanıyoruz.
self.baskent = baskent gibi. Fonksiyon parametresi olan başkenti, benim içimdeki veri yapısı olan başkente ata şeklinde.





En başta kısaca dedim, daha uzun yazmak gibi bir amacım vardı :D ama saat gece 3 olmuş ve vaktim yok daha fazla. Sorun olursa mesaj atabilirsin.
sorum yok siz çok güzel anlatıyorsunuzda ben anlamıyorum :d
 
sorum yok siz çok güzel anlatıyorsunuzda ben anlamıyorum :d
Daha az uykusuz bir şekilde tekrar deneyeyim o zaman :D Madde madde olunca şahsen ben daha kolay anlıyorum o yüzden öyle yazacağım.

Veri yapıları, içlerinde veri grubu bulunduran (birden fazla değişken ya da fonksiyon) programcı tarafından oluşturulan özel bir değişken türüdür.

Veri yapısının içindeki verilere "nokta + değişken adı" yazımıyla ulaşılır. Örneğin "a" değişkeni, özel oluşturulmuş ülke classınında bir veriyse bunun başkentini "a.baskent" yazarak alırız.

Bir classla çalışacaksak genelde o classın özellikleriyle çeşitli işlemler yapan fonksiyonlar kullanırız ve bu fonksiyonları kodun okunaklı olması açısından classın içine yazarız.

Self kelimesi tam olarak burada devreye giriyor. Örneğin bir ülke değişkenimizin başkentini değiştirmek istiyoruz. Fonksiyonlar bizim değişkenlerimize ulaşamayacakları için ülke değişkenimizi fonksiyona parametre olarak vermek zorundayız. Örneğin class dışında bir fonksiyon şöyle olur:

def setCapital(country, capitalName):
country.capital = capitalName

Ancak bu fonksiyonu classın içinde yazarsak, hem kodu bizden sonra okuyan kişi için daha okunaklı bir kod yazmış oluruz hem de classın kendi fonksiyonu olacağından ülke değişkenini ayrıca fonksiyona yollamamız gerekmez. Bunu da görelim:

{ //burası classın içi
def setCapital (Self, capitalName):
self.capital = capitalName
} //classın bitişi

Not: Python kullanmayalı çok uzun zaman oldu. Hatırladığım kadarıyla yine de fonksiyonun parametrelerine "Self"i koyman gerekiyor ancak fonksiyonu çağırırken sanki Self parametresi yokmuş gibi kullanıyoruz

a.setCapital("Ankara")

Gördüğün gibi daha okunaklı ve basit.

Gelelim "__init__"e. Veri yapıları birden fazla değişken içerebildiğinden, direkt tanımlama yapmak mümkün değildir.

Özel veri yapımızda bir tanımlama yapmak için constructor methodumuzdan (fonksiyonumuzdan) faydalanmamız gerekir.

Constructor methodu "__init__" adıyla classın içinde tanımlanır ve amacı veri yapısını oluşturmaktır. Bir önceki yazımda da bahsettiğim gibi "__init__"i yazmazsan, veri yapını tanımladığında içindeki tüm değişkenler boş olur ve tek tek elle içlerini doldurman gerekir.

İnit fonksiyonları genelde classının sahip olduğu değişken sayısı +1 kadar (Bir de "Self) parametre alır ve elimizden geldiğince classın içindeki değişkenlerin ismiyle constructor methodunun parametrelerinin isimlerini aynı tutmaya çalışırız. Maksat okunaklılık yine.

class icindeBesVeriTuttugumAnlamsizClass:
def __init__(Self, var1, var2, var3, var4, var5):
Self.var1 = var1
Self.var2 = var2
Self.var3 = var3
Self.var4 = var4
Self.var5 = var5

"__init__" methodumuz olduğuna göre, artık değişkenimizi şöyle oluşturabiliriz:

a = icindeBesVeriTuttugumAnlamsizClass(var1, var2, var3, var4, var5)

Umarım bu daha çok yardımcı olmuştur :D Classları daha iyi anlamak için Java öğrenmeni tavsiye ederim ama mümkünse Java'da kendini çok geliştirme :d İnanılmaz yavaş bir dil ve Java ile yazılmış programları kullanırken kanser oluyorum.
 
Hocam Mükemmel anlatmışsınız elinize kolunuza ve ağzınıza sağlık . Bende __init__ ve self'in tam olarak ne anlama geldiğini bilmiyordum ama şimdi sizin sayenizde anladım . Çok teşekkür ederim .
 

Yeni konular

Geri
Yukarı