Python classlar

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