5.1 Giriş səviyyələri
Yəqin ki, __init__
adlı qəribə konstruktoru fərq etdiniz? Gələcəkdə siz bu tipə çox tez-tez rast gələcəksiniz.
Python-da siniflərdəki atributlar və metodlara müxtəlif giriş səviyyələri mövcuddur ki, bu da məlumatların görünürlüğünü və təhlükəsizliyini idarə etməyə kömək edir. Girişə nəzarət mexanizmləri əsasən atribut və metod adlarının əvvəlində bir və ya iki alt xətt (_
və __
) istifadə etməyi əhatə edir.
Razılaşmaların istifadəsi
Bir alt xətt _
sinif və ya modul xaricində istifadə edilməməli olan atributlar və metodlar üçün istifadə olunur. Bu qadağan deyil, sadəcə kodun oxunaqlılığı və texniki dəstəyini yaxşılaşdırmaq üçün riayət ediləcək razılaşmadır.
İki alt xətt __
isə həqiqətən gizli və xaricdən təsadüfi və ya qəsdən daxil olmağın qarşısını almaq üçün qorunmuş olan atributlar və metodlar üçün istifadə olunur. name mangling
mexanizmi onları daha az əlçatan edir, amma yenə də xüsusi adlar vasitəsilə mümkündür.
İctimai (public)
sahələr və metodlar
İctimai atributlar və metodlar kodun istənilən yerindən istifadə edilə bilər
. Python-da defolt olaraq bütün atributlar və metodlar ictimaildir, əgər onların adları alt xətt ilə başlamırsa.
class MyClass:
def __init__(self):
self.public_attribute = "Mən ictimaiyəm"
def public_method(self):
return "Bu, ictimai bir metoddur"
obj = MyClass()
print(obj.public_attribute) # Əlçatandır
print(obj.public_method()) # Əlçatandır
Python dilində giriş səviyyələri vasitəsilə inkapsulyasiya həyata keçirilir, xüsusilə qeyri-ictimai sahələr və metodlar vasitəsilə.
5.2 Gizli sahələr və metodlar
Müdafiə olunmuş (protected)
sahələr və metodlar
Müdafiə olunmuş atributlar və metodlar adından əvvəl bir xətt çəkişi _
ilə işarə olunur və yalnız sinifin və onun subklasslarının daxilində istifadə üçün nəzərdə tutulmuşdur. Bu, proqramçılara məlumatların sinifdən kənarda istifadə edilməməsi lazım olduğunu göstərən bir razılaşmadır.
class MyClass:
def __init__(self):
self._protected_attribute = "Mən müdafiə olunmuşam"
def _protected_method(self):
return "Bu müdafiə olunmuş metoddu"
obj = MyClass()
print(obj._protected_attribute) # Əldə edilə bilər, amma tövsiyə olunmur
print(obj._protected_method()) # Əldə edilə bilər, amma tövsiyə olunmur
Özəl (private)
sahələr və metodlar
Python-da özəl atributlar və metodlar adından əvvəl iki xətt çəkişi __
ilə işarə olunur. Bu atributlar və metodlar yalnız sinifin daxilində istifadə üçün nəzərdə tutulmuşdur və əsas məqsədləri daxili implementasiyanı gizlətmək və məlumatları təsadüfi dəyişikliklərdən və ya kənar istifadədən qorumaqdır.
Bu cür atributlara və metodlara birbaşa girişin qarşısını almaq üçün Python xüsusi bir mexanizm istifadə edir, buna name mangling
(adın təhrif edilməsi) deyilir. Bu mexanizm şəxsi atributların adlarını avtomatik olaraq dəyişir və onlara sinif adından ibarət prefiks əlavə edir. Məsələn, MyClass
sinifində __private_attribute
özəl atributu daxili olaraq _MyClass__private_attribute
adına çevriləcək.
Bu, məlumatları təsadüfi girişdən qorumağa imkan verir və onları sinifin daxilində istifadə etməyə şərait yaradır. Lakin, xatırlayaraq ki, "name mangling"
tam bir müdafiə deyil — təcrübəli bir proqramçı dəyişdirilmiş adı istifadə edərək bu məlumatlara giriş əldə edə bilər.
Gəlin bunun necə işlədiyini təcrübədə baxaq:
class MyClass:
def __init__(self):
self.__private_attribute = "Mən özələm"
def __private_method(self):
return "Bu özəl metoddur"
def access_private_method(self):
return self.__private_method()
obj = MyClass()
# print(obj.__private_attribute) # Səhv, birbaşa əlçatmaz
# print(obj.__private_method()) # Səhv, birbaşa əlçatmaz
print(obj.access_private_method()) # Sinifin açıq metodu ilə əlçatandır
Gördüyümüz kimi, özəl atributlara və ya metodlara birbaşa giriş xəta yaradır. Amma Python dəyişdirilmiş adı istifadə edərək onlara giriş imkanı saxlayır. Məsələn, özəl atrubuta dəyişdirilmiş ad vasitəsilə bu şəkildə giriş edə bilərsiniz:
class MyClass:
def __init__(self):
self.__private_attribute = "Mən özələm"
obj = MyClass()
print(obj._MyClass__private_attribute) # Çıxış: Mən özələm
Dəyişdirilmiş adla giriş mümkün olsa da, bu yoldan çəkinmək məsləhətlidir, çünki bu, inkapsulyasiya prinsiplərini pozur və kodun sabitliyinə təsir edə bilər.
Python-un atributların adlarını necə dəyişdirdiyini görmək üçün dir()
adlı daxili funksiyadan istifadə edə bilərsiniz. Bu funksiya obyektin bütün əlçatan atributlarını və metodlarını göstərəcək:
class MyClass:
def __init__(self):
self.__private_attribute = "Mən özələm"
obj = MyClass()
print(dir(obj)) # Obyektin bütün atributlarını və metodlarını göstərir, dəyişdirilmiş adlar daxil olmaqla
dir()
funksiyasının nəticəsi olaraq, obyektdəki bütün atribut və metodların siyahısını, o cümlədən _MyClass__private_attribute
görəcəksiniz. Bu, "name mangling"
mexanizmini təsdiq edir.
5.3 Metodların Avtomatik Çağırılması
Konstruktorlarla işləyərkən diqqətinizi çəkmiş ola biləcək maraqlı bir məqam var idi. __init__
metodu avtomatik çağırılırdı.
Əslində belə vəziyyətlər çoxdur, və bu vəziyyətlər üçün metodlar da çoxdur. Misallar:
__str__
Metodu
Əgər sizin obyektinizdə __str__
metodu varsa, bu metod avtomatik olaraq obyektinizi sətirə çevirməyə çalışdığınız zaman çağırılacaq, məsələn, print()
və str()
funksiyalarından istifadə etdiyiniz zaman.
class Cat:
def __init__(self, name, age):
self.name = name
self.age = age
def __str__(self):
return f"{self.name} {self.age} yaşındadır"
cat = Cat("Barsik", 5)
print(cat) # Çıxış: Barsik 5 yaşındadır
__len__
Metodu
Əgər sizin obyektinizdə __len__
metodu varsa, bu metod obyektinizin «uzunluğunu» müəyyən etməyə çalışanda, yəni len()
funksiyası tərəfindən avtomatik olaraq çağırılacaq. Misal:
class MyList:
def __init__(self, items):
self.items = items
def __len__(self):
return len(self.items)
my_list = MyList([1, 2, 3])
print(len(my_list)) # Çıxış: 3
Belə «xidmət metodları» ilə həyatınızda çox qarşılaşacaqsınız, amma onlarla işləmək bir zövqdür. Ona görə də hazır olun :)
GO TO FULL VERSION