Python'da @property dekoratörü, normal alanlar gibi görünen ama aslında getter, setter veya deleter mantığını işleyen "sanal" özellikler oluşturmaya olanak tanır. Bu, hesaplanmış özellikler oluşturmak veya verilere erişim kontrolü sağlamak için kullanışlıdır.
Örnek:
class Rectangle: def __init__(self, width, height): self._width = width self._height = height @property def area(self): return self._width * self._height @property def width(self): return self._width @width.setter def width(self, value): if value <= 0: raise ValueError('Genişlik pozitif olmalıdır') self._width = value r = Rectangle(3, 4) print(r.area) # 12 (özellik olarak çağrılır, fonksiyon değil) r.width = 10 # setter otomatik olarak çağrıldı
Sadece bir @property (get metodu) kullanmak, setter tanımlamadan mümkün mü? Böyle bir özelliği değiştirmeye çalıştığımızda ne olur?
Cevap: Sadece getter @property tanımlanabilir, setter (ve deleter) olmadan. Böyle bir özellik yalnızca okunabilir olacak, atama girişimi AttributeError ile sonuçlanacaktır.
class C: @property def x(self): return 42 c = C() c.x = 99 # AttributeError: özelliği ayarlamak mümkün değil
Hikaye
Standart kütüphaneyi kullanarak bir nesneyi serileştirmeye çalıştılar, vars(obj) kullanarak özellikler sözlüğünü almak için. Görüldü ki property metodları __dict__ çıktısına dahil edilmedi, bu da verilerin sızmasına neden oldu.
Hikaye
Proje, property için setter eklemeyi unuttu, bu da hesaplanan alanın değerini değiştirmeye yönelik bir denemenin çalışma zamanında hata vermesine neden oldu, oysa mimari mantık gereği bunun beklenmesi gerekiyordu.
Hikaye
Çalışan kodda property'nin değerinin hesaplanması, her erişimde beklenmedik bir şekilde ağır veya güvensiz işlemlere neden oluyordu. Bu, performansı düşürdü ve çoklu iş parçacıklı kodda bloklayıcı çağrılara yol açtı.