Mündəricat[Gizlət][Göstər]
Bu mühazirədə biz python-da siniflər, konstruktorlar və irsiyyət haqqında öyrənəcəyik.
Bu anlayışlar, müxtəlif növlərin müəyyən edilməsinə ehtiyac duyulan böyük bir proqramda həqiqətən vacibdir.
Dərslər
Dərslər proqramlaşdırmada vacibdir və onlar python üçün xüsusi deyil. Bir çox başqa proqramlaşdırma dilləri siniflər anlayışını dəstəkləyir. Yeni məlumat növlərini müəyyən etmək üçün siniflərdən istifadə edirik.
İndiyə qədər biz Python-da rəqəmlər, sətirlər və boolean kimi əsas məlumat növləri haqqında öyrəndik. Bunlar Python-da əsas və ya sadə məlumat növləridir. Siyahılar və lüğətlər kimi bir neçə mürəkkəb məlumat növlərini də gördük.
Bu növlər son dərəcə faydalı olsa da, mürəkkəb anlayışları modelləşdirmək üçün həmişə istifadə edilə bilməz. Məsələn, bir nöqtə və ya bir alış səbəti ideyası haqqında düşünün. Alış-veriş səbəti boolean və ya siyahı deyil. Bu, fərqli bir məlumat növüdür. Beləliklə, real konsepsiyaları modelləşdirmək üçün yeni tipləri müəyyən etmək üçün siniflərdən istifadə edə bilərik.
İndi nöqtə adlanan yeni məlumat tipini təyin edək. Bu yeni tipdə əvvəllər yoxladığımız kimi üsullar olacaq.
Bunu belə edəcəksiniz:
Biz “class” açar sözündən istifadə edərək sinfi təyin etməklə başlayırıq və dərhal sonra sinfimizə ad veririk.
class Point
İndi burada istifadə etdiyim adlandırma konvensiyasına baxın. Mən burada ilk hərfi böyük hərflə yazdım, buna biz paskal adlandırma konvensiyası deyirik. Bu konvensiya dəyişənlərimizi və funksiyalarımızı adlandırmaq üçün istifadə etdiyimiz konvensiyadan fərqlidir ki, biz həmişə kiçik hərflərdən istifadə edirik və bir neçə sözü alt xətt ilə ayırırıq. Amma sinifləri adlandırarkən bir neçə sözü ayırmaq üçün alt xəttdən istifadə etmirik, hər sözün ilk hərfini böyük hərflə yazırıq.
Sinifimizi təyin etdikdən sonra iki nöqtə istifadə olunur, bu o deməkdir ki, indi blok müəyyən edilmişdir.
class Point:
def move (self):
Bu blokda biz nöqtələrə aid olan bütün funksiyaları və ya metodları müəyyən edə bilərik. Məsələn, bir nöqtəni hərəkət etdirmək üçün "hərəkət" adlı bir funksiya təyin edə bilərik. Qeyd edək ki, biz açıq mötərizə yazan kimi PyCharm avtomatik olaraq bura “özünü” əlavə edir. Bu xüsusi açar sözdür və icazə verin, qısa zamanda bu mövzuya qayıdaq. Gəlin terminalda “hərəkət” yazısını çap edək.
print("move")
Gəlin “çəkmək” kimi başqa bir üsul təyin edək və onu terminalda çap edək.
def draw(self):
print("draw")
“Nöqtə” sinifimizin tərifini başa çatdırdıq. Bu yeni tiplə biz yeni obyektlər yarada bilərik. Sinif sadəcə olaraq həmin plana əsaslanan faktiki nümunələr olan obyektlərin yaradılması üçün plan və ya şablonu müəyyən edir. Obyekt yaratmaq üçün biz sinifimizin adını yazırıq və sonra onu funksiya kimi çağırırıq. Bu, yeni bir obyekt yaradır və sonra onu qaytarır. Sonra həmin obyekti dəyişəndə saxlaya bilərik. İcazə verin sizə göstərim:
Burada üç ölçülü nöqtə olan “nöqtə1” təyin etdik. Görürsünüz ki, biz terminalda fərdi koordinatları çap edə bilərik.
Bu nöqtə ilə "çəkmək" və "hərəkət etmək" iki üsulundan istifadə edə bilərik.
Xülasə etmək üçün, biz yeni tipləri müəyyən etmək üçün siniflərdən istifadə edirik və bu tiplər sinfin əsas hissəsində müəyyən etdiyimiz metodlara malik ola bilər. Dərslərdə proqramlarımızın istənilən yerində təyin edə biləcəyimiz atributlar ola bilər.
İnşaatçılar
İndiyə qədər biz siniflərdən istifadə edərək yeni tiplər yaratmağı öyrəndik. İndi bu tətbiqdə kiçik bir problem var. Siniflərdən istifadə edərək x və ya y koordinatı olmayan nöqtə obyekti yarada bilərik və bu ideal deyil. Qoy sənə göstərim.
X koordinatını təyin etməzdən əvvəl nöqtə yaradaq və onu çap edək. Proqramımızı işə salmaq belə bir atribut xətası ilə nəticələnir:
Bu o deməkdir ki, nöqtə obyektinin x adlı atributu yoxdur. İndi problem ondadır ki, x və ya y koordinatları olmayan nöqtə obyektinə sahib olmaq mümkündür. Bunun mənası yoxdur, çünki biz hər hansı bir nöqtə haqqında danışarkən, o nöqtənin harada yerləşdiyini bilməliyik. Bu problemi həll etmək üçün konstruktordan istifadə edirik. Konstruktor obyekt yaratma zamanı çağırılan funksiyadır.
Budur konstruktordan necə istifadə edirik. Əvvəlcə yuxarıdakı proqramda x və y koordinat qiymətlərini keçirək.
point = Point(10, 20)
print(point.x)
İndi bu sinifə konstruktor adlanan xüsusi metodu əlavə etməliyik. Onun sintaksisi belədir:
def __init__(self, x, y):
init
başlanğıc üçün qısadır və bu, yeni nöqtə obyekti yaradılan zaman çağırılan funksiya və ya metoddur. X və y dərhal sonra əlavə olunur self
iki əlavə parametr əlavə etmək üçün.
Bundan sonra x və y-ni ötürülən dəyərlərə, yəni 10 və 20-yə uyğunlaşdırmalıyıq
self.x = x
self.y = y
Biz istifadə self
cari obyektə istinad etmək və sonra “x” funksiyasına ötürülən x arqumentinə x atributunu təyin edirik. Bu şəkildə istifadə init
metodu ilə obyektlərimizi işə sala bilərik. Bu üsul konstruktor adlanır. Proqramımızı icra edək.
İndi x və y koordinatlarını sonra dəyişə bilərik. Gəlin x koordinatını yeniləyək:
point = Point(10, 20)
point.x = 11
print(point.x)
İndi x koordinatı 11 dəyərinə yenilənir.
Həyata
Budur sizin üçün maraqlı bir məşq.
İstəyirəm ki, insan adlı yeni tip müəyyən edəsiniz. Bu “Şəxs” obyektlərində “name
” atributu və “talk()
”Metodu.
Bu sadə bir işdir və bir neçə dəqiqədən çox çəkməməlidir.
Həll
“Şəxs” sinfini belə təyin etməklə başlayın:
class Person:
self.name = name
Konstruktoru sonra müəyyən edəcəyik. İndi biz “Şəxs” obyektini yarada bilərik. Gəlin onu John adlandıraq
john = Person("John Smith")
print(john.name)
john.talk()
İndi kodun birinci hissəsinə keçin və konstruktor yaradın.
def __init__(self, name):
Son kod belə görünəcək:
Siz həmçinin siniflər və konstruktorlarla birlikdə formatlanmış sətirlərdən və digər anlayışlardan istifadə edə bilərsiniz.
Miras
Vərəsəlik, kodu təkrar istifadə etməyə imkan verən siniflərlə əlaqəli başqa bir anlayışdır.
Bu kod parçasını nəzərdən keçirin.
class Dog:
def walk(self):
print("walk")
“Gəzinti” üsulu ilə “İt” sinfi yaratdıq. Bu üsulda biz sadəcə olaraq terminalda gediş mesajını çap edirik. Tutaq ki, real proqramda burada bir sətir əvəzinə 10 sətir kod var. Gələcəkdə "gəzinti" metoduna sahib olmaq üçün başqa bir sinifə ehtiyac olarsa, bütün kodu təkrarlamalı olacağıq. Bu ideal deyil.
Proqramlaşdırmada DRY adlı bir prinsipimiz var ki, bu da özünü təkrarlama deməkdir. Deyək ki, gələcəkdə nə vaxtsa “gəzinti” üsulumuzla bağlı problem aşkar edirik və əgər bu üsulu bir çox başqa yerlərdə təkrarlamış və ya təkrarlamışıqsa, geri qayıtmalı və bunu təkrarladığımız hər yerdə bu problemi həll etməliyik. kod. Ona görə də proqramlaşdırmada bir şeyi iki dəfə təyin etməməliyik.
Bu problemi həll etmək üçün müxtəlif yanaşmalar var, lakin biz burada yeni başlayanlar üçün daha asan olanı öyrənəcəyik və buna miras deyilir. Bu halda biz başqa bir “məməli” sinfi yaradacağıq və həmin sinifdə “gəzmək” atributumuzu müəyyən edəcəyik.
class Mammal:
def walk(self):
print("walk")
“Məməlilər” sinfimizi təyin etdikdən sonra bu kimi atributları ötürmək üçün mirasdan istifadə edə bilərik:
Həm it, həm də pişik sinifləri ana siniflərində müəyyən edilmiş bütün sinif metodlarını miras alırlar. İndi bu kimi itlərə xas üsullar əlavə edə bilərik:
class Dog:
def bark(self):
print("bark")
Tamamlayın!
Bütün bunlar siniflər, konstruktorlar və miras anlayışları olan siniflərdə kodun təkrar istifadəsi ilə bağlı idi. İndi serialımızın sonuna yaxınlaşırıq. Bu nöqtəyə qədər siz Python-da yaxşı, oxunaqlı və qısa kodlar hazırlaya bilməlisiniz.
Növbəti mühazirədə modullar və paketlər anlayışı ilə tanış olacağıq.
Cavab yaz