Python classlar

Python’da class oluşturarak yaptığımız programlar daha doğrusu nesne tabanlı programların asıl amacı nedir yani class kullanımı sadece işi kolaylaştırmak mı(farklı dosyalardan çağırıp kullanmak için)? class kullanmadan yapılamayacak bir şey var mı? Şuan, ileri düzey olmasa da yazdığım küçük programcıklarda hiç class kulanmadım ve bi sorun yaşamadım.

Class Yazmana Gerek Yok Fakat Daha Düzenli Falan Görünüyor…Tabii Yazılmasıda Lazımdır Bazı Programlarda Ama Daha Hiç Kullanmadım.

Nesne tabanlı programlama soyut ya da somut kavramları/nesneleri program içerisinde ifade etmeni sağlar. Mesela vektörleri ele alalım, class yani sınıf yerine bir 3 boyutlu vektörü 4 elemanlı liste olarak ifade edebiliriz: vektör_değişkeni = [3, 2, 3, 4.7]. Burda ilk 3 eleman sırasıyla x, y, z koordinatlarını 4. eleman ise vektörün boyunu (magnitude) temsil ediyor.

Fakat burda 2 sorun var, 1.si program ya da kullanıcı burdaki koordinatları değiştirdiğinde boy değişmiyor, sen sınıf kullanarak boyu her koordinat değişiminde güncelleyebilirsin.
2.sorun ise boy değerinin yanlışlıkla değiştirilmesi, sınıf içerisinde bezeyici kullanarak boyun sadece nesnenin kendisi tarafından değiştirilmesini sağlayabilirsin. Örnek:

class Vektör:
    def __init__(self, x, y, z):
        self.koordinatlar = [x, y, z]
        self._boy = math.sqrt(x * x + y * y + z * z)

    def koordinat_güncelle(self, x, y, z):

        self.koordinatlar = [x, y, z]
        self._boy = math.sqrt(x * x + y * y + z * z)

    @property 
    def boy(self):
        return self._boy 

vektörnesnesi = Vektör(1, 2, 3)
print(vektörnesnesi.boy) # konsolda 3.7 yazar
vektörnesnesi.koordinat_güncelle(3, 4, 5)
print(vektörnesnesi.boy) # konsolda 7.0 yazar
vektörnesnesi.boy = 5 # # `setter` olmadan `property` olması durumunda değeri değiştirmeye çalışmak hata verir AttributeError: can't set attribute

Sınıf niteliği ile method adı aynı olmamalı bu yüzden method adı boy niteliğin adı _boy. @property bezeyicisi ve kullanımları için forumdaki şu başlığa bak Fonksiyon ve Sınıflarda Bezeyiciler.

Tabii Python’da vektörnesnesi.boy = 5 satırı hata verse de vektörnesnesi._boy = 5 ile boyu değiştirebilirsin ama bazı diller bunu yapmanı engeller.

Bunları fonksiyonlarla da yapabilirsin ama bunu sınıflar ve sınıflara ait metodlarla yapmak düzen açısından daha uygun olabilir, özellikle de karmaşık nesneler üzerinde birçok farklı işlem yapman gerekince.

Daha fazlası için https://belgeler.yazbel.com/python-istihza/nesne_tabanli_programlama1.html

Merhaba,
Python’da bir sınıfa neden ihtiyaç duyarız bundan bahsetmek isterim.
Sınıflar konusuna az çok aşina olanlar bilirler ki, bir sınıfa ait fonksiyona erişebilmek için

Sınıf.fonksiyon()

şeklinde bir ifade yazmamız yeterlidir.
Aynı şekilde bu fonksiyona, örnek üzerinden, şu yolla erişebileceğimizi de söylemek mümkün:

Sınıf().fonksiyon()

Yukarıdaki her iki yöntem de bizi fonksiyon() isimli tanımlanmış bir işe götürür. Birine, sınıf üzerinden, diğerine de örnek üzerinden bu fonksiyonu ulaşabiliriz.

Sınıfların belki de en karakteristik özelliği, kendi içinde tanımlanmış değişkenleri global alandan çağırıp, onları değiştirebiliyor olmamızdır (bu özellik fonksiyonlarda yoktur.). Aşağıdaki yazım şekli değişken üzerinde istediğimiz türden değişiklikler yapmamızı sağlar:

class Sınıf:
    degisken = None


Sınıf.degisken = yeni_deger

Normalde bu değiştirme işlemini fonksiyonlarda, fonksiyon bir değişkeni geri döndermediği sürece yapamayız. Yani şöyle bir yol izlememiz gerekir:

def fonksiyon():
    ...
    ...
    return deger


geri_donen_deger = fonksiyon()

Ama sınıflarda tanımlanmış bir değişken, bir sınıf değişkeni veya örnek değişkeni ise, bu değişken global alanda çağrılabilir. Bu, sınıf içerisinde tanımlanan bir sınıf veya örnek değişkenini global alanda değiştirebileceğimiz anlamına gelir. Ancak aynı durum fonksiyonlar için geçerli değildir.

def f():
    x = None
    ...  # Bu arada bir çok işlem tanımlanmış olsun.
    return x


deger_1 = f.x  #Böyle bir kullanım mümkün değildir.
deger_1 = f()  # Ancak böyle bir kullanım mümkündür.

Fonksiyonlarda eğer bir değişken dışarı gönderilecekse onu return veya yield anahtar kelimeleriyle çağrılabilir hale getirmek zorundayız. Ve o değişkeni çağıran komuta kadar yazılmış olan bütün kodlar çalıştırılır. Biz bazen bazı kodların ikinci defa çalıştırılmasını istemeyiz, doğrudan değişkene erişmek isteriz, işte böyle durumlarda bir sınıfa ait olan bir sınıf veya bir örnek değişkeni bizim işimizi kolaylaştırır.

class Sinif:
    x = None


Sinif.x = 2
print(Sinif.x)

Ayriyeten siniflarla sunları da saglarız(belki bahsedildi ama ben goremedim sahsen):

class fonksiyon_grubu():

    def fonksiyon1(self):
        self.fonksiyon2()
        print("fonksiyon1")

    def fonksiyon2(self):
        print("fonksiyon2")

Bu isi class olmadan yapmaya calısalım:

def fonksiyon1(self):
    fonksiyon2()
    print("fonksiyon1")

def fonksiyon2():
        print("fonksiyon2")

fonksiyon1()

Bu kodları calıstırırsanız hata alırsınız.Sahsen sınıfların cok yararını gordum ben.

Sınıfları organize olmus grup gibi de dusunebilirsiniz,ne derler: “birlikten kuvvet dogar.”

Ayriyeten (bahsedildi sanirim ama) def init()
fonksiyonu da cok is goruyor.classlarla sunlari da yapabilirsiniz:

class ornek():
    def __init__(self,ilk_parametre,ikinci_parametre):
        self.ilk = ilk_parametre
        self.ikinci = ikinci_parametre
        self.fonksiyon1()

    def fonksiyon1(self):
        self.fonksiyon2()
        print(self.ilk)

    def fonksiyon2(self):
        print(self.ikinci)

a1 = ornek("1.parametre","2. parametre")#burada hemen __init__ devreye giriyor zaten.Bu isi fonksiyonlarla yapsanız daha cok kod yazmak zorunda kalabilirsiniz.Bu basit bir kod parcası,ama daha karısık  bir program gelistirmeye calisirken class ları kullanmalısınız,kodlarınıza daha sonra baktıgınızda daha iyi anlamak istiyorsaniz sınıflar en iyi tercih olabilir.
1 Beğeni