3.1 Sınıfın yaradılması
Python-da siniflərin yaradılması - obyekt yönümlü proqramlaşdırmanın (OYP) vacib hissəsidir. Siniflər yeni məlumat növlərinin yaradılmasına imkan verir, hansılar ki, öz atributlarına və metodlarına sahib ola bilərlər. Gəlin Python-da siniflərin yaradılmasının əsas konseptlərini və nümunələrini nəzərdən keçirək.
Əsas anlayışlar
- Sinif: obyektlərin yaradılması üçün şablon. Sinif, həmin sinifin obyektlərinə aid olacaq atributları və metodları müəyyən edir.
- Obyekt: sinifin nümunəsi. Obyekt, sinifdə müəyyən olunmuş bütün atributlara və metodlara malikdir.
- Atribut: sinif və ya obyektlə bağlı dəyişən.
- Metod: sinif və ya obyektlə bağlı funksiya.
Atributlar əslində obyektin və ya sinifin daxili dəyişənləridir. Metodlar isə sinif daxilində müəyyən edilmiş funksiyalardır. Bu terminlər OYP-dən gəlib və funksiyalar və dəyişənlərlə yanaşı istifadə olunur.
Yeni sinif elan etmək (yaratmaq) üçün class
açar sözü istifadə olunur. Bu əməliyyatın ümumi sintaksisi belədir:
class SinifAdi:
dəyişən1 = deyer1
dəyişənN = deyerN
def funksiya1(self):
funksiyanın kodu
def funksiyaM(self):
funksiyanın kodu
Əsasən, deyə bilərik ki, sinif — kiçik bir proqramdır (dəyişənlər + funksiyalar), hansı ki, ayrı bir sahədə yerləşdirilmişdir — SinifAdi.
Sinifi yaratdıqdan sonra həmin sinifin obyektlərini (nümunələrini) yarada bilərsiniz. Bu kod daha da sadə görünür:
dəyişənX = SinifAdi()
Vacibdir!
Python-da dəyişən və metod adlarını kiçik hərflərlə yazmaq tövsiyə olunur. Sinif adları isə böyük hərflərlə yazılır. Həmçinin, sinif adlarının yazılmasında alt cizgi işarəsi istifadə olunmur. Əgər sinif adı bir neçə sözdən ibarətdirsə, hər bir söz böyük hərflə yazılır.
Sinifin/obyektin dəyişəninə müraciət etmək istəyirsinizsə, bu kod adətən belə görünür:
dəyişənX.dəyişən1 = 10
dəyişənX.funksiyaM()
Ancaq burada bəzi nüanslar var, hansılara ki, daha sonra…
3.2 Obyektlə iş
Həm sinif, həm də sinifin nümunəsi (sinf obyekti) obyektlərdir, ona görə də hər ikisinin öz dəyişənləri və metodları ola bilər.
İki növ dəyişən mövcuddur:
- Sinf atributu/Dəyişəni/Sahəsi
(class property)
- Obyekt atributu/Dəyişəni/Sahəsi
(object property)
Və tam üç növ metod var:
- Sinf metodu/Funksiyası
(class method)
- Obyekt metodu/Funksiyası
(instance method)
- Statik metod
(static method)
Metodlar bəyan edilmə üsuluna və çağırılma üsuluna görə fərqlənir.
Obyekt metodları
Obyekt metodunu bəyan edərkən birinci məcburi parametr — self
ötürmək lazımdır. Metod çağırıldıqda bu parametrə obyekt (instance
) haqqında istinad ötürülür.
class MyClass:
def instance_method(self):
print(type(self)) # <class 'MyClass'>
my_object = MyClass()
my_object.instance_method()
Yuxarıdakı nümunədə, instance_method()
funksiyası işləməyə başlayanda self
parametrinə my_object
obyektinə istinad ötürülüb.
Sinf metodları
Sinf metodunu bəyan edərkən də birinci məcburi parametr — cls
ötürmək lazımdır. Metod çağırıldıqda bu parametrə sinifə istinad (class object
) ötürülür. Həmçinin sinf metodu classmethod
dekoratoru ilə işarələnməlidir, aşağıdakı nümunədə olduğu kimi:
class MyClass:
def instance_method(self):
print(type(self)) # <class 'MyClass'>
@classmethod
def class_method(cls):
print(type(cls)) # <class 'type'>
my_object = MyClass()
my_object.instance_method()
MyClass.class_method()
Yuxarıdakı nümunədə, class_method()
funksiyası işləməyə başlayanda cls
parametrinə MyClass
sinifinə istinad ötürülüb.
Statik metod
Statik metod bəyan edərkən ora heç bir şey ötürməyə ehtiyac yoxdur, lakin o, həmçinin sinifin daxili məlumatlarına müraciət edə bilməyəcək. Metod staticmethod
dekoratoru ilə işarələnməlidir, aşağıdakı nümunədə olduğu kimi:
class MyClass:
def instance_method(self):
print(type(self)) # <class 'MyClass'>
@classmethod
def class_method(cls):
print(type(cls)) # <class 'type'>
@staticmethod
def static_method():
return "Bu metod nümunə və ya sinifdən asılı deyil"
my_object = MyClass()
my_object.instance_method()
MyClass.class_method()
MyClass.static_method()
Statik metod sinif metoduna çox oxşar şəkildə çağırılır, lakin ora nə obyektə istinad, nə də sinifə istinad ötürülmür.
3.3 Sinif dəyişənləri
Sinif dəyişənləri
Sinifin dəyişənini (atributunu) elan etmək üçün onu sadəcə sinif daxilində istənilən yerdə elan etmək lazımdır. Adətən bu işin əvvəlində, sinif metodlarının elanından əvvəl edilir. Məsələn:
class MyClass:
attribute = "Mən sinif atributuyam"
@classmethod
def class_method(cls):
print(cls.attribute) # Mən sinif atributuyam
my_object = MyClass()
MyClass.class_method()
Əgər sinif dəyişənin (atributunun) dəyərini oxumaq və ya dəyərini yazmaq istəyirsinizsə, onda cls
obyektindən istifadə edin.
Əslində, sinif dəyişəninə sinifin adı ilə də müraciət etmək olar:
class MyClass:
attribute = "Mən sinif atributuyam"
@classmethod
def class_method(cls):
print(MyClass.attribute) # Mən sinif atributuyam
my_object = MyClass()
print(MyClass.attribute) # Mən sinif atributuyam
Obyektin dəyişənləri/sahələri
Obyektin dəyişənləri (instance
) — self
obyektinin sahələridir. Siz sadəcə onlarla self.name
vasitəsilə işləyirsiniz. Məhz buna görə self
obyekti hər bir obyekt metoduna ötürülür.
Nümunə:
class MyClass:
attribute = "Mən sinif atributuyam"
def set_name(self, name):
self.name = name
def print_name(self):
print(self.name)
my_object = MyClass()
my_object.set_name("name adlı obyekt sahəsi")
my_object.print_name() # "name adlı obyekt sahəsi"
Hər dəfə bir obyekt metodu çağırdığınızda, birinci parametr olaraq (self)
, metodu çağırdığınız obyektə keçid rolunda ötürülür. Müxtəlif obyekt metodları bu obyektlərin ümumi məlumatlarını self
obyektindən istifadə edərək əldə edə bilərlər.
GO TO FULL VERSION