ProgramlamaPython geliştirici

Python'da korumalı ve özel değişkenler ile yöntemler nedir, kapsülleme nasıl gerçekleştirilir ve Python gerçekten bir nesnenin iç durumunu ne kadar korur?

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

Cevap.

Soru tarihi
Klasik nesne yönelimli programlamada kapsülleme, iç verilere erişimi kısıtlayarak uygulanır. Çoğu dilde katı erişim modifikatörleri vardır. Python'da "hepimiz yetişkiniz" prensibi geçerlidir — katı bir özel durum yoktur.

Sorun
Geliştiriciler, Python'daki korumalı (_protected) ve özel (__private) nitelikleri ve yöntemleri karıştırıyor, "çift alt çizgi"nin tam koruma sağladığını düşünüyor ya da tamamen korunma olmadığına inanıyorlar.

Çözüm
Python, anlaşmaları gerçekleştirir: tek alt çizgi _var — korumalı, çift alt çizgi __var — özel (isim mangling). Böyle bir niteliğe veya metoda erişim mümkündür, ancak daha zordur: _ClassName__var olarak çağrılır.

Kod örneği:

class Example: def __init__(self): self._protected = 1 # korumalı self.__private = 2 # özel (isim mangling) ex = Example() print(ex._protected) # 1 #print(ex.__private) # AttributeError print(ex._Example__private) # 2 (isim mangling)

Ana özellikler:

  • Tek alt çizgi — anlaşma: "dokunma" sınıf dışında ve hiyerarşide.
  • Çift alt çizgi — isim mangling: değişkene sınıf adı eklenir byte kodda.
  • Python erişimi yasaklamaz, sadece zorlaştırır — bu bir anlaşmadır, katı bir kısıtlama değildir.

Aldatıcı sorular.

Bir örnek üzerinden "özel" alana erişebilir miyiz?

Evet, mangling yoluyla: _ClassName__var. Yani veriler erişilebilir, sadece açık değildir.

Özel yöntem/nitelik miras alındığında nasıl davranır?

İsim mangling, miras alanların ebeveynin özel ögelerini yanlışlıkla yeniden tanımlamasını engeller, fakat erişim sağlanabilir: _ParentClass__attr üzerinden. Çift alt çizgili yöntemler, miras alan sınıfından dışarıdan "görünmez".

class A: def __foo(self): print("A") class B(A): def bar(self): # self.__foo() — hata self._A__foo() # çalışıyor

Python'da JVM/C++ seviyesinde tam özellik var mı?

Hayır. Her şey anlaşmalara ve manglinge dayanır. Verileri tamamen korumak mümkün değildir, çünkü Python dinamik olarak herhangi bir niteliğe erişim sağlar.

Tipik hatalar ve anti-modeler

  • Çift alt çizgi ile tam koruma beklemek.
  • Miras alanlarda özel yöntemlerin kullanılması, okunabilirliği ve genişletilebilirliği azaltır.
  • Yeterli olan yerde tek alt çizgi yerine yaygın olarak çift alt çizgi kullanımı.

Gerçek hayattan örnek

Olumsuz durum

Büyük bir kütüphanede kullanıcı, özel bir niteliği çift alt çizgi ile değiştirmeye çalıştı, bunun "gizli" olduğunu düşündü — ancak _ClassName__var aracılığıyla değişiklik yine gerçekleşti.

Artılar:

  • Niteliğin otomatik tamamlama tarafından görünmez hale getirilmesi.

Eksiler:

  • Özel olma yanılsaması.
  • Sınıfın invariantiğini bozma imkanı.

Olumlu durum

Bir projede, iç alanlar için tek alt çizgi kullanma konusunda anlaşıldı ve bunlara sınıf dışında dokunulmaması gerekti. Güvenli erişim için property eklendi.

Artılar:

  • Okunabilirlik, anlaşmalara uyum.
  • Kodun kolay bakımı.

Eksiler:

  • Katı bir özel durumun olmaması: dikkatsiz bir geliştirici, anlaşmaları ihlal ederek erişim sağlama olabilir.