@ismailarilik hocam kusura bakma konuyu biraz dağıttık.
@ismailarilik hoca bu örnekte sınıfları zorunlu olarak kullanmamış diyebilirim. İnternette karşılaşabileceğiniz, Tkinter ile yapılmış bir çok uygulamada sınıfların yaygın olarak kullanıldığını görebilirsiniz. Pekala sınıfları kullanmadan da aynı programı tasarlayabilirdi @ismailarilik hoca.
Örneği biraz incelemeye çalışalım:
class Editor(tk.Text):
# Burada İsmail Hoca, Editor isimli sınıfı oluştururken sınıfın
# özelliklerinin tk.Text sınıfından miras alınacağını belirtmiş.
def __init__(self, master=None, undo=True, wrap=tk.NONE):
# Burada, Editor sınıfından örnek oluşturulduğunda, örneğin ne gibi
# özelliklere sahip olacağı argümanlarla belirtilmiş. Gördüğünüz gibi
# bu argümanların ön-tanımlı değerleri var.
# __init__ bir magic function'dır. Magic functionların gösterimi
# __fonksiyon__ şeklinde olur.
super().__init__(master, undo=undo, wrap=wrap)
# Burada, Editor sınıfından bir tane örnek oluşturulduğu zaman
# miras alınan sınıfın özelliklerinin örneğe aktarılacağını görüyoruz.
# Buna kalıtım (inheritance) denir.
# Ve __init__(self) fonksiyonu içinde, daha başka değişkenler
# tanımlanmış.
# __init__ fonksiyonu içinde tanımlanan değişkenler veya
# bu fonksiyon altında çağrılan başka fonksiyonlar,
# Editor sınıfından örnek oluşturulduğu zaman,
# örneğin sahip olacağı özellikleri ve/veya örnek
# oluşturulur oluşturulmaz çalışmaya başlayacak
# fonksiyonları belirtir.
# Mesela İsmail Hocam şöyle bir değişken tanımlamış:
# vertical_scrollbar = tk.Scrollbar(master)
# Gördüğünüz gibi değişkenin başında self ifadesi yok.
# Dolayısıyla bu değişken, sınıfın diğer fonksiyonlarında
# şu haliyle kullanılamaz. Zaten sınıf içine baktığınızda
# başka hiç bir yerde kullanılmadıklarını göreceksiniz.
Bazı durumlarda yapmak istediğiniz işlem için sadece sınıf kullanabilirsiniz. Sizinle bu konuyla ilgili
bir örneği Python derleyici yapma - dildeolupbiten tarafından #26 başlığında paylaşmıştım.
Ama genellikle bir değişkene erişimi kolaylaştırmak ve ayrıca kodlara bir düzen vermek için de kullanılır (Yani diyelim kedi isminde bir nesneniz var ama bu nesnenin yaş, renk, boy, miyavlama gibi bir çok özelliği olduğunu varsayalım. Böyle nesneler için sınıf kullanabilirsiniz. Kullanmasanız da olur ancak kullanırsanız belli bir nesnenin özelliklerini bir arada tutmuş olursunuz.).
self ifadesi ile, __init__ içinde tanımlanmış her bir değişken, sınıfın herhangi bir yerinde kullanılabilir. Oysa biz sınıf yerine fonksiyon kullandığımızda ve bir fonksiyon içindeki değişkene başka bir fonksiyon içinden erişmek istediğimizde global deyimini kullanırız. Hatırlayın, bununla ilgili SOCKET programlamada fonksiyon içindeki DEĞİŞKENİ BAŞKA BİR FONKSİYONDA TANIMLAMA ! - dildeolupbiten tarafından #7 başlığında sizinle yazışmıştık.
Sınıf Ve Fonksiyon Arasındaki Fark Nedir? - dildeolupbiten tarafından #7 başlığını da daha önce incelemediyseniz, bir göz atın derim.
Sınıfların, fonksiyonlara göre şöyle bir özelliği de var; bir sınıfın içinde tanımlanmış niteliklere ve fonksiyonlara dışarıdan erişmek mümkünken, fonksiyonda bu ancak return ve yield deyimleri kullanılırsa mümkündür. Örnek üzerinden anlatmaya çalışayım:
def f():
x = 1
y = 2
return x, y
# Burada return'ı kullanmasaydık, x ve y'ye
# dışarıdan erişemezdik.
x1 = f()[0]
y1 = f()[1]
print(x1, y1)
Şimdi de yukarıdaki fonksiyona benzer bir sınıf oluşturalım:
class C:
x = 1 # Sınıf niteliği
y = 2 # Sınıf niteliği
x1 = C.x
y1 = C.y
print(x1, y1)
# Sınıf niteliklerine hem sınıftan (C) hem de örnekten (C()) ulaşabiliriz.
x2 = C().x
y2 = C().y
print(x2, y2)
# Mesela bu sınıfın __init__() isimli bir metodu yok:
print(C().__init__())
# Sonuç: None
Yani __init__'de tıpkı diğer fonksiyonlar gibi bir fonksiyondur. Ancak bu fonksiyonda, bir örnek oluşturulur oluşturulmaz otomatik olarak yapılacak işlemler tanımlanır.
Mesela;
class C:
def __init__(self):
print("Örnek oluşturulduğunda bu mesaj otomatik olarak ekrana yazdırılır.")
c = C()
# Sonuç: Örnek oluşturulduğunda bu mesaj otomatik olarak ekrana yazdırılır.
Diğer bütün fonksiyonlar ise çağrılırlarsa çalışırlar.
Aynı örnekten devam edeyim:
class C:
def __init__(self):
print("Örnek oluşturulduğunda bu mesaj otomatik olarak ekrana yazdırılır.")
self.x = 10 # Örnek niteliği.
def baska_bir_fonksiyon(self):
"""Bu fonksiyon da örnek niteliğinin karesini alsın."""
return self.x ** 2
c = C()
# Sonuç: Örnek oluşturulduğunda bu mesaj otomatik olarak ekrana yazdırılır.
# Diğer fonksiyonu ise şu şekilde çalıştırırız.
degisken = c.baska_bir_fonksiyon()
print(degisken)
Forumda sınıflarla alakalı bazı başlıklar var onları da okumanızı ve ayrıca istihza belgelerine de bakmanızı tavsiye ederim.