Python Encapsulation Kapsulleme
Python Encapsulation Kapsulleme yazımızda OOP standartlarından olan Kapsüllemeye değineceğiz.Kapsülleme bir nesnenin iç yapısını,özelliklerini bozulmalara ve hatalara karşı dış dünyadan korumaktır.Bir nesnenin iç yapısının korunması demek başka sınıflar tarafından korunan özelliklere erişilmemesi demektir.Bu koruma işlemi programlama dillerinde erişim belirleyiciler sayesinde olmaktadır.Bir yapının diğer sınıflar üzerinden erişimini engellemek için private tanımlamamız gerektiğini bir önceki yazımızda anlatmıştık.Şimdi bir sınıfta yer alan özellikleri kapsüllemeye bakalım.
class Muhendis: __ad="Yazılım" __soyad="hanem" def EkranaYaz(self): print(self.__ad) print(self.__soyad) muhendis=Muhendis() muhendis.EkranaYaz()
Output:
Yazılım
hanem
Yukarıdaki kod incelendiği zaman Muhendis sınıfının 2 değişkeninin de dışarıdan erişime kapatıldığı(kapsüllendiği) görünmektedir.Kapsüllenen değişkenlere sadece o class içerisinden erişim mevcuttur.
Kapsüllenen değişkenlerin bazen kullanılması veya değerinin güncellenmesi de gerekebilir. Örneğin Mühendis sınıfındaki ad değişkenini bir yerde kullanacaksınız.Private olduğu için tek başına erişemiyorsunuz.Sınıflar tasarlanırken böyle durumlar hesap edilmeli ve kullanıcıya değişkenlerin değerini veren metotlar oluşturulmalıdır.Bu metotlar erişime açıktır ve programcılar tarafından getter metotları olarak adlandırılırlar.Bu metotların temel amacı kapsüllenmiş değişkenlerin değerini döndermektir.
class Muhendis: __ad="Yazılım" __soyad="hanem" def _EkranaYaz(self): print(self.__ad) print(self.__soyad) def get_ad(self): return self.__ad def get_soyad(self): return self.__soyad muhendis=Muhendis() print(muhendis.get_soyad()) print(muhendis.get_ad())
Output:
hanem
Yazılım
Bazı durumlarda da oluşturulan bu private alanların değerlerini güncellemek gerekebilir.Erişime açık metotlar ile her değişkenin alanını tek tek güncelleyebilmeliyiz.Bu metotlara programcılar setter metotları demektedirler.Amaç private alanın değerini güncellemektir.
class Muhendis: __ad="Yazılım" __soyad="hanem" def EkranaYaz(self): print(self.__ad) print(self.__soyad) def set_ad(self,ad): self.__ad=ad def set_soyad(self,soyad): self.__soyad=soyad muhendis=Muhendis() muhendis.set_soyad("safalı") muhendis.set_ad("yaşar") muhendis.EkranaYaz()
Output:
yaşar
safalı
Kapsülleme konusunun daha iyi anlaşılabilmesi bir örnek daha yapalım.Bir İnsanlar sınıfı olsun.Bu sınıfa ait üyelerin boyları,yaşları,isimleri olsun.Daha önceki yazılarımızda __init__() fonksiyonunu ve Sınıfları anlatmıştık henüz okumadıysanız bu adresten okuyabilirsiniz.
class Insanlar: def __init__(self,isim,yas,boy): self.__isim=isim self.__yas=yas self.__boy=boy def EkranaYaz(self): print(self.__isim) print(self.__yas) print(self.__boy) def get_isim(self): return self.__isim def get_boy(self): return self.__boy def get_yas(self): return self.__yas def set_isim(self,isim): self.__isim=isim def set_boy(self,boy): self.__boy=boy def set_yas(self,yas): self.__yas=yas insan=Insanlar("ali",27,175) insan.EkranaYaz()
Output:
ali
27
175
Sınıfımızı oluşturduk.Bu sınıftan insan isminde bir nesne oluşturduk ve bu nesnenin özelliklerini “ali”,17,175 yaptık.Peki ya değerleri yanlış yazmış olsanız.Private tanımlandığı için direk olarak erişemeyeceksiniz.Doğal olarak set metotları ile güncelleyeceksiniz.
insan.set_boy(180) insan.set_yas(25) insan.set_isim("veli")
Güncelleme işlemi başarılı mı kontrol edelim.
insan.EkranaYaz()
Output:
veli
25
180
Görüldüğü gibi değerler değiştirildi.Değerlere toplu olarak değilde tek tek erişmeniz gerektiğinde bu sefer getter metotlarını kullanacağız.
print(insan.get_isim()) print(insan.get_boy()) print(insan.get_yas())
Output:
veli
180
25
Python’da ve OOP’de Encapsulation (Kapsülleme ) işlemi yapılırken temel prensip bu şekildedir.Asıl amaç nesnelerin bazı özelliklerini dış dünyaya kapatıp bozulmaları ve hataları engellemektir.Private alanların üzerinde kontrollü bir şekilde işlem yaptırmak için getter ve setter diye adlandırılan metotlar dan yararlanılır.Getter ve Setter metotları kodun okunabilirliği açısından programcıların oluşturduğu bir isimlendirmedir.İsterseniz herhangi bir isim verebilirsiniz.Getter fonksiyonların amacı kullanıcıya private alanın değerini döndermektedir.Setter fonksiyonların amacı ise değerlerini güncellemektir.
Bir sonraki yazımızda görüşmek dileğiyle