Sınıf Ve Fonksiyon Arasındaki Fark Nedir?

Evet aslında önemli. Hatta bazı durumlarda sınıf kullanmadan istenilen işlemi yapmanın başka bir yolu yok. Mesela sizinle iki tane örnek paylaşayım.

Bu örneklerden birincisinde hiç sınıf kullanılmamış. İstenirse kullanılabilir ama gereği yok.

Kodlar:

#!/usr/bin/env python3
# -*- coding: utf-8 -*-

try:
    import Tkinter as tk
except ImportError:
    import tkinter as tk

root = tk.Tk()


def widgetleri_olustur():
    for i, j in enumerate(("Çalıştır", "Temizle")):
        text = tk.Text(master=root)
        text.grid(row=0, column=i)
        button = tk.Button(master=root, text=j)
        button.grid(row=1, column=i)
        yield text
        yield button


t1, b1, t2, b2 = widgetleri_olustur()


def command1():
    t2.insert("insert", t1.get("1.0", "end"))


def command2():
    t2.delete("1.0", "end")


b1.configure(command=command1)
b2.configure(command=command2)
root.mainloop()

Yukarıdaki kodlar, iki tane text ve button widgeti olan basit bir uygulamaya ait. Soldaki text widgetine yazdığınız yazı, Çalıştır düğmesine basınca, sağdaki text widgetine aynen aktarılıyor. Temizle düğmesi de sağdaki text widgetine aktarılmış yazıyı temizliyor. Bütün olayı bu programın. Ve bu uygulama için class kullanmaya gerek yok.

Şimdi de ikinci uygulamayı bir inceleyin.

Kodlar:

#!/usr/bin/env python3
# -*- coding: utf-8 -*-

import sys
try:
    import Tkinter as tk
except ImportError:
    import tkinter as tk

root = tk.Tk()


def widgetleri_olustur():
    for i, j in enumerate(("Çalıştır", "Temizle")):
        text = tk.Text(master=root)
        text.grid(row=0, column=i)
        button = tk.Button(master=root, text=j)
        button.grid(row=1, column=i)
        yield text
        yield button


t1, b1, t2, b2 = widgetleri_olustur()


class StdIOYonlendiricisi:
    """
    Bu sınıfta sys.stdout'un write, flush
    özelliklerine benzer özellikler tanımladık.
    Bu özelliklerin yapısı, widgetin
    yapısına uygun olacak şekilde düzenlendi.
    Böylece standart çıktıları bir widgete yönlendirebiliriz.
    """
    def __init__(self, text):
        self.text = text

    def write(self, string):
        self.text.insert("insert", string)

    def flush(self):
        self.text.update()


sys.stdout = StdIOYonlendiricisi(text=t2)
sys.stderr = StdIOYonlendiricisi(text=t2)


def command1():
    exec(t1.get("1.0", "end"))


def command2():
    t2.delete("1.0", "end")


b1.configure(command=command1)
b2.configure(command=command2)
root.mainloop()

İşte bu son örnekte sınıfı kullanmamızın bir amacı var. Ve bir fonksiyon, bu örnekte sınıfın yaptığı işlemi yapamaz. Belki başka türlü de standart çıktı konumları bir widgete yönlendirilebilir, ama ben henüz nasıl yapıldığını bilmiyorum.

Bazen sınıflar şu amaçla da kullanılıyor: Oluşturmak istediğimiz sınıf başka bir sınıfın bütün özelliklerini miras almış oluyor. Miras alınan sınıfın bir veya bir kaç metodunu kendi oluşturduğumuz sınıfta override etmek isteyeceğimiz bir durumla karşılaşabiliyoruz (yani miras aldığımız sınıfın metodu yerine, kendi yazdığımız metodu kullanmak istiyoruz.).

1 Beğeni