Merhabalar arkadaşlar, Sitemizi programlama ile ilgilenen bütün arkadaşlarımızın türkçe içerik konusunda çektiği sıkıntılar düşünülerek soru/cevap şeklinde bir etkileşimde bulunabilmesi için kurduk. Umuyoruz hepimiz için güzel bir deneyim olur. Hasscript Ekibi

Sorunuz mu var? Belki de çoktan soruldu..

0
Python'da self nedir?

Açık 1 Cevaplar 29 Gösterim Python
Python'da self ne demek oluyor? Java'daki this ile aynı diyebilir miyiz?

1 cevap

0

Konuyu biraz detaylı incelediğimiz zaman uzadıkça uzuyor. Kısaca bahsedeyim.

OOP kullanarak program yazdığımız zaman bir metodun hangi sınıfa ait olduğunu belirliyoruz. Dilden dile değişiklikler gösteriyor. Self kelimesi de python dilindeki karşılık oluyor. Örnekle ilerleyelim,

Sanıyorum güzel bir örnek C++ ile verilebilir

// example: one class, two objects
#include <iostream>
using namespace std;

class Rectangle {
    int width, height;
  public:
    void set_values (int,int);
    int area () {return width*height;}
};

void Rectangle::set_values (int x, int y) {
  width = x;
  height = y;
}

int main () {
  Rectangle rect, rectb;
  rect.set_values (3,4);
  rectb.set_values (5,6);
  cout << "rect area: " << rect.area() << endl;
  cout << "rectb area: " << rectb.area() << endl;
  return 0;
}

Bu örneği cplusplus.com'dan aldım.

Önce Rectangle adında bir sınıf tanımı yazılmış.

  • Bu sınıfın public metodları public sekmesinde tanımlanmış, gayet güzel.
  • Sonra bu metodun kodu yazılması gerekiyor.
  • Hemen altında da Rectangle::set_values metodunun kodu yazılmış.
  • Java'da yazsaydık direk ilk set_values dediğimiz yerde içini de yazacaktık. Yani, void set_values(int i, int j) { this.width = i; this.height = j;} diye yazacaktı, sonraya bırakmayacaktı.
  • Java ve C++ da metodun içine yazdığımız -kodlar static olmadığı durumda- o an hangi sınıf hafızada yaratılmışsa o sınıf üzerinden çalışır. Yani aşağıda Rectangle rect dediği yerde hafızada bir rectangle sınıfı örneği oluşturulmuş olur. rect.set_values(3, 4)  dediği kısımda da az önce oluşturulan hafızadaki tanımlanmış rect alanına atamaları yapar. Tam anlamamız gereken yer burası.
  • Bu kodu derlediğimiz zaman, sınıfın kodu C++ ve java derleyicileri tarafından bizim için hafızadaki alan ile metodların bağlama işlemini otomatik yapar.
    • Peki bunu nasıl yapar? Derleme anında kodun derleyici tarafından çevrilmiş hali void set_values(rectangle*, int, int) buna benzer birşey olacak. Bildiğimiz gibi işlemci elektronik olarak nesne yönelimi, fonksiyonel felan anlamaz. Onun yerine derleyici veya yorumlayıcılar bu kodu işlemcinin anlayacağı şekle çevirir. Burada anlamamız gereken set_values metodunın ilk parametresi aslında çağrıldığı sınıfın pointeri olarak şekilde derlenir.
  • Python'da bu kısmı programcı açık açık yazmak zorunda.

Bir fonksiyon yazdığımız zaman, fonksiyonun bir objeye ait olacağını -dolayısıyla bu bir metod olacak- o objenin referansını vererek belirtiyoruz.

Kısacası fonksiyonu metoda çevirmiş oluyoruz. Python'da işler bu şekilde yürüyor.

(4.3k puan)