ProgramlamaPython geliştirici

Python'da anotasyonlu (property) özellikler nedir, yerleşik @property dekoratörü nasıl çalışır ve ne amaçla (ve ne zaman) kullanılır? Örnekler verin ve property ile çalışırken yaygın hatalar hakkında bilgi verin.

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

Cevap.

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ı

Alakalı bir soru.

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

Konunun inceliklerini bilmemekten kaynaklanan gerçek hata örnekleri.


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