Python-da classlar (Hissə 1): Classlar və obyektlərin yaradılması

Python-da classlar (Hissə 1): Classlar və obyektlərin yaradılması

Bir neçə hissədən ibarət olacaq bu məqalələrdə Python-da olan classlar ilə tanış olacağıq. Xoş mütaliələr.

Python dilində demək olar ki, hər şey obyektdir. Obyekt sadə şəkildə desək, məlumatların (dəyişənlər) və metodların (ingcə. method) birləşməsidir. Class da bunlardan biridir. Bəs class-ı başqalarından fərqli edən nədir? O elə bir obyektdir ki, başqa obyektlərin yaradılmasında istifadə edilə bilir.

“Metod” və “funksiya” sözləri class kontekstində eyni mənanı daşıyır və bu məqalədə “metod” sözünü məhz bu mənada işlədəcəm.

Biz classı evin sxeminə bənzədə bilərik. Bu sxemdə ev haqqında bir çox məlumatı (evin ölçülərini, tikilmə təlimatlarını və s.) tapa bilirik. Sxemdə qeyd olunanlara əsasən də evi tikmək olur. Nəticədə bu tikdiyimiz ev obyekt sayılır.

Bir sxemdən bir çox ev tikilə bildiyi kimi, bir classdan da bir neçə obyekt düzəldilə bilər. Hər yaradılan obyekt bu classın instansiyası (ingcə. instance) sayılır və bu prosesin adı isə (səhv tərcümə olma ehtimalı çoxdur) instansiasiyadır (ingcə. instantiation).

Söz ilə izah etmək kod ilə izah etməkdən daha çətin olacaq, deyəsən … İndi əsas məsələyə keçmək vaxtıdır.

Classların yaradılması

class Person:
    """
    This is docstring for Person class. It is empty for now.
    """
    pass

Kodda əsasən ingilis dilindən istifadə edəcəm. Kodun yazıldğı font bizim dili dəstəkləmədiyi üçün belə etməyə məcbur qaldım. Bununla belə kodun izahını bizim dildə verəcəyəm.

Class yaratmaq üçün dildə rezerv olunmuş sözlərdən biri olan class sözünün ardınca yaratmaq istədiyimiz classın adını qeyd edirik. Funksiyalarda olduğu kimi boşluqların (ingcə. whitespace) olması önəmlidir.

Hal hazırda classda heç bir şey qeyd edilməyib və sadəcə komment və pass kod hissəciyindən ibarətdir. Başlanğıcda boş olduğuna görə Python-dan xəta mesajı almamaq üçün bu şəkildə yazmaq lazımdır. İndi isə yeni obyekt yaratmaq haqda danışaq.

Yeni obyektin yaradılması

person_1 = Person()                # creating first Person instance.

person_1.f_name = "Javid"         # first name 
person_1.l_name = "Khasizada"     # last name
person_1.age = 21                 # age

print(person_1.f_name)             # output: Javid

Classdan istifadə edərək yeni obyekt yaratmaq üçün class adını çağırmaq lazımdır, bu eynilə funksiyanı istifadə etməyə bənzəyir. 1-ci sətirdə biz person_1 obyektini yaratmışıq.

Bir əvvəlki bölmədə gördüyümüz kimi class-ın daxilində heç bir məlumat və ya funksiya yoxdur, o səbəbdən 3-5-ci sətirlərdə obyektə yeni dəyişənlər (ingcə. variable) əlavə edirik. Bu şəkildə biz adı Cavid, soyadı Xasizadə və yaşı 21 olan person_1 obyekti əldə edirik. Yaddaşa verilmiş bu məlumatları 7-ci sətirdə göründüyü kimi sonradan çap etmək də mümkündür.

Yeri gəlmişkən, Python ilə birlikdə adımın ingiliscə necə olduğunu da öyrənmiş oldun :)

Lakin burda kiçik bir problem var. Hər dəfə yeni obyekt yaradan zaman bu prosesi təkrarlamaq heç də məntiqli səslənmir. Bu səbəbdən də classın bu prosesi daha sərfəli yol ilə həll edən bir metodu var və bu __init__ metodudur. Bu metoddan istifadə edərək obyekt yaradılan zaman dəyişənləri obyektin yaddaşına yaza bilərik.

Artıq class-ımız boş olmayacaq!

class Person:
    """
    This is docstring for Person class.  

    Methods
        __init__: initializes new object and saves provided 
            variables for objects.
    """
    def __init__(self, f_name, l_name, age):
        self.f_name = f_name            # first name
        self.l_name = l_name            # last name
        self.age = age

person_1 = Person("Javid", "Khasizada", 21)

print(person_1.f_name)                    # output: Javid

Gəlin ilk öncə funskiyada olan parametrləri başa düşək. Gördüymüz kimi 4 parametr qeyd olunub və bunlar self, f_name, l_nameage-dir. Son 3 parametr bizim bir əvvəki kodda əlavə etmək istədiyimiz məlumatlardır. Birinci parametr isə bəzən çaşqınlığa səbə olan nüanslardan biridir.

Bu parametr hal-hazırkı obyektin özünə istinad edir. Məsələn, person_1 obyekti yaranan zaman self parametri person_1-in özüdür. self.f_name = f_name ilə bir az əvvəl yazdığımız person_1.f_name eyni əməliyyatı edir. Obyektin yaddaşına bu dəyişəni əlavə edir və sonradan istifadəsinə şərait yaradır. Məhz bu səbəbdən biz 16-ci sətirdə adın çap edildiyini görə bilərik.

__init__ funksiyası olduğu zaman obyekt yaradılması nisbətən dəyişir və əlavə etmək istədiyimiz məlumatlar classa arqument kimi ötürülür (14-cü sətir). Bir də onu qeyd etməliyik ki, self parametri üçün heçnə etmək lazım deyil. Avtomatik olaraq bu dil tərəfində həll edilir və obyektin özü arqument kimi metoda ötürülür.

Metodlar (funksiyalar)

Classın tərifində dediyimiz kimi class dəyişənlər və metodlardan ibarətdir. Dəyişənlər mövzusuna bir daha geri dönəcək olsaq da, bu hissə haqqında qısaca danışdıq. Metodlara (ingcə. method) gəldikdə isə, onlar elə funksiyadır deyə bilərik.

Hər yeni obyekt classda olan metodları avtomatik olaraq istifadə edə bilir. Bundan əlavə obyektin məlumatlarını funksiyaya arqument kimi ötürməyə də ehtiyac qalmır. Sözü çox uzatmadan gəlin nümunə üzərindən davam edək.

class Person:    
    def __init__(self, f_name, l_name, age):
        self.f_name = f_name            # first name
        self.l_name = l_name            # last name
        self.age = age

    def get_fullname(self):
        return f'{self.f_name} {self.l_name}' # '{} {}'.format(self.f_name, self.l_name)

person_1 = Person("Javid", "Khasizada", 21)

print(person_1.get_fullname())            # output: Javid Khasizada

Qeyd: Artıq bəzi kommentləri gərəksiz olduğu üçün, daha doğrusu, kod açıq-aydın olduğu üçün sildim. Zənnimcə, kömək etmirsə olmasa, daha yaxşıdır.

Artıq Person classında yeni metod var, bu metodun əsas məqsədi çağırıldığı zaman insan obyektinin tam adını geri qaytarır. 12-ci sətirdən də görmək olar ki, sadəcə funksiyanı obyektin ardınca çağırmaqla (object.method_name()) istifadə etmək olar. __init__ metodunda olduğu kimi bu metodlda da self parametri vacibdir. self parametrindən istifadə edərək obyektə əlavə etdiyimiz ad və soyadı qaytara bilərik.

Biz bu metodlara başqa parametrlər də əlavə edə bilərik. Bunun üçün sadəcə self-dən sonra istədiyimiz parametri əlavə edirik. Deyək ki, insanın hər hansı bir verilən ildə neçə yaşı olduğunu və ya olacağını öyrənmək istəyirik. Bunu aşağıdakı kimi yaza bilərik.

from datetime import datetime

class Person:
    # some code

    def calculate_age(self, year):
        """
        Function returns age of person in given year.

        Args
            year: integer
        """

        curr_year = datetime.today().year     # current year
        birth_year = curr_year - self.age

        if birth_year > year:
            return f"I was born in {birth_year}."

        return year - birth_year

person_1 = Person("Javid", "Khasizada", 21)
print(person_1.calculate_age(2015))         # output: 15
print(person_1.calculate_age(1987))            # output: I was born in 2000.

Nümunələrdən də gördüyümüz kimi istənilən ildə insanın neçə yaşı olduğunu hesablaya bilirik. Əlavə olaraq əgər insan hələ doğulmayıbsa, doğulduğu ili göstərən mesajı cavab kimi qaytarırıq. Bu qədər sadə şəkildə yeni parametrlər əlavə edərək metodlarımızı daha da genişləndirə bilərik.

Məzmun

Beləliklə bu məqalənin sonuna çatdıq. Bu məqalədə aşağıdakıları öyrəndik:

  • Class və onun yaradılması
  • Obyektin yaradılması
  • Obyektə məlumatların yazılması
  • Metodlardan istifadə

Did you find this article valuable?

Support Javid Khasizada by becoming a sponsor. Any amount is appreciated!