ProgramlamaYazılım Mühendisi

Python'da sınıf özellikleri (class properties) nasıl çalışır? Property ile normal öznitelikler arasındaki fark nedir, hesaplanan bir özelliği nasıl gerçekleştiririz, getter/setter bekçi fonksiyonlarına dikkat etmenin önemi nedir?

Hintsage yapay zeka asistanı ile mülakatları geçin

Cevap.

Python'daki özellikler (property), özniteliklerin kapsüllenmesini şık bir şekilde gerçekleştirmek için, başka dillerdeki (Java/C++) getter ve setter'lara benzer bir yol olarak ortaya çıktı, ancak yöntemleri açıkça çağırma gereğini ortadan kaldırdı. Property öncesinde, erişimi açık yöntemler (get/set) aracılığıyla uygulamak zorundaydık, bu da sınıfın arayüzünü karmaşık hale getiriyordu.

Sorun, sınıf kullanıcısının özniteliklerle (dot notasyonu obj.x kullanarak) şeffaf bir arayüzle çalışabilmesi, arka planda ise değerlerin hesaplanması, kontrol edilmesi, önbelleğe alınması veya doğrulanmasıyla ilgili mantığın kontrol edilebilmesidir. Property olmadan, iç uygulama değiştiğinde, tüm çağrıları değiştirmek zorunda kalıyorsunuz, bu da büyük hata oranlarına ve genişletilebilirliğin azalmasına neden oluyor.

Çözüm — @property dekoratörü, bir yöntemi bir özniteliğe dönüştürmeyi sağlar ve hesaplama, kontrol veya tembel yükleme mantığını yöntemin içinde gizler, sınıfın dış arayüzünü değiştirmeden. Getter yalnızca okuma için, .setter ile yazma düzenlenir ve .deleter ile silme işlemi yapılır.

Kod örneği:

class Rectangle: def __init__(self, width, height): self._width = width self._height = height @property def area(self): # 'area' artık bir öznitelik olarak okunabiliyor return self._width * self._height @property def width(self): return self._width @width.setter def width(self, value): # rect.width = ... atandığında otomatik olarak çağrılır assert value > 0, "Width must be positive" self._width = value rect = Rectangle(3, 4) print(rect.area) # 12 rect.width = 10 print(rect.area) # 40

Anahtar özellikler:

  • Özellikler, normal öznitelik erişimi altında hesaplamaları veya kontrolleri gizler.
  • property, getter, setter, deleter destekler.
  • property kullanımı, uygulama değiştirildiğinde kullanıcı kodunu değiştirmeyi gerektirmez.

Kandırıcı Sorular.

Property, sınıf yöntemleri veya statik yöntemlerle çalışabilir mi?

Hayır. Property, yalnızca örnek düzeyindeki özellikleri (instance-level) oluşturur. Sınıf seviyesinde özel açıklayıcılar veya @classmethod-property kullanmalısınız (manuel olarak uygulanır).

Sadece getter ile bir property bildirilirse, özniteliğe yazma işlemi yapılabilir mi?

Hayır. Böyle bir property yalnızca okunabilir; atama girişimi AttributeError yükseltir.

Setter içinde bir istisna (örneğin, assert) ortaya çıkarsa ne olur?

İstisna dışarıya fırlatılır, atama gerçekleşmez ve öznitelik değeri olduğu gibi kalır. Bu, doğrulama için sıkça kullanılır.

Yaygın Hatalar ve Anti-Kalıplar

  • Property'nin arka planında korunan (_attr) veya özel (__attr) öznitelikler kullanmamak — recursive self.attr referansı ile sonsuz döngü alabilirsiniz.
  • Hesaplamalar veya kontrol olmadığında property kullanmak.
  • Setter'da doğrulama olmaması, sınıfın gözlem değerlerinin bozulmasına neden olabilir.

Gerçek Hayattan Bir Örnek

Olumsuz durum: Sınıfın genel öznitelikleri, kontrole tabi olmadan değiştirilmesi.
Artılar: hızlı, basit.
Eksiler: müşteri kodunu yeniden yazmadan iç mantığı değiştirmek imkânsız, tutarsız durumlar olabilir.

Olumlu durum: property aracılığıyla kapsülleme, getter/setter içinde mantık, sıkı kontroller.
Artılar: esneklik, kontrol, şeffaflık, API'nin güvenli evrimi.
Eksiler: biraz daha fazla kod, hata ayıklamada önemsiz bir karmaşıklık.