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:
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.
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.