- Sinif və obyekt anlayışlarını izah etmək
__init__, atributlar və metodlarla sinif yazmaq- Varislikdən istifadə etmək və metodu yenidən təyin etmək
Elektron jurnal yazırsan: hər şagirdin adı, sinfi və qiymətləri var, onun üçün orta qiyməti hesablamaq, yeni qiymət əlavə etmək lazımdır. 30 şagird üçün ayrı-ayrı dəyişənlər və funksiyalar tez bir zamanda qarışıqlığa çevrilir. Obyektyönlü proqramlaşdırma (OYP) başqa yol təklif edir: verilənləri və onlarla işləyən funksiyaları bir «paketdə» — obyektdə birləşdirmək.
Sinif və obyekt
Sinif — obyektlərin çertyojudur: hər obyektdə hansı məlumatların olacağını və onun nə edə biləcəyini təsvir edir. Obyekt isə bu çertyoj əsasında yaradılmış konkret nüsxədir. Bir çertyojla çoxlu ev tikmək olduğu kimi, bir sinifdən də istənilən qədər obyekt yaratmaq olar.
| Termin | Mənası | Nümunədə |
|---|---|---|
| Sinif | obyektlərin çertyoju | Student |
| Obyekt | sinifdən yaradılmış nüsxə | aysel |
| Atribut | obyektin daxilindəki dəyişən | self.name |
| Metod | obyektin daxilindəki funksiya | average() |
İlk sinif
class Student:
def __init__(self, name, grade):
self.name = name
self.grade = grade
self.scores = []
def add_score(self, score):
self.scores.append(score)
def average(self):
return sum(self.scores) / len(self.scores)
def __str__(self):
return f'{self.name} (grade {self.grade})'
aysel = Student('Aysel', 8)
murad = Student('Murad', 9)
aysel.add_score(5)
aysel.add_score(4)
murad.add_score(3)
print(aysel, aysel.scores)
print(murad, murad.scores)
print('Average:', aysel.average())▸ Gözlənilən nəticə
Aysel (grade 8) [5, 4] Murad (grade 9) [3] Average: 4.5
class Student:yeni sinif təyin edir. Sinif adları adətən böyük hərflə yazılır.__init__xüsusi metoddur — konstruktor:Student('Aysel', 8)yazanda avtomatik çağırılır və obyektin atributlarını hazırlayır.selfmetodun çağırıldığı obyektin özüdür. Məsələn,aysel.add_score(5)yazandaselfeləayseldeməkdir.__str__obyektinprintilə necə göstəriləcəyini müəyyən edir.
Diqqət et: aysel və murad eyni sinifdən yaradılıb, amma hər birinin öz qiymətlər siyahısı var. Birinə qiymət əlavə etmək digərinə təsir etmir — obyektlər müstəqildir.
Varislik
Varislik mövcud sinif əsasında yeni sinif yaratmağa imkan verir. Törəmə sinif valideyn sinfin bütün atribut və metodlarını alır, lazım olanları isə yenidən təyin edə (override) bilər. Aşağıda Dog və Cat sinifləri introduce metodunu Animal-dan hazır götürür, speak metodunu isə özlərinə uyğun dəyişir:
class Animal:
def __init__(self, name):
self.name = name
def speak(self):
return '...'
def introduce(self):
return f'I am {self.name} and I say {self.speak()}'
class Dog(Animal):
def speak(self):
return 'Woof!'
class Cat(Animal):
def speak(self):
return 'Meow!'
for pet in [Dog('Rex'), Cat('Mestan'), Animal('Nemo')]:
print(pet.introduce())▸ Gözlənilən nəticə
I am Rex and I say Woof! I am Mestan and I say Meow! I am Nemo and I say ...
Eyni introduce() çağırışı hər obyektdə fərqli nəticə verdi, çünki hər obyekt öz speak metodunu işlədir. Bu xüsusiyyətə polimorfizm deyilir. Törəmə sinfə yeni atribut lazımdırsa, onun __init__ metodunda super().__init__(...) ilə əvvəlcə valideyn sinfin konstruktorunu çağırırıq:
class Animal:
def __init__(self, name):
self.name = name
class Parrot(Animal):
def __init__(self, name, words):
super().__init__(name)
self.words = words
def talk(self):
return self.name + ' says ' + ' and '.join(self.words)
tutu = Parrot('Tutu', ['hello', 'salam'])
print(tutu.talk())
print(isinstance(tutu, Animal))▸ Gözlənilən nəticə
Tutu says hello and salam True
Player sinfini yaz: __init__ adı saxlasın və score xalını 0 etsin, add_points(points) metodu xalı artırsın, __str__ isə Aysel: 25 points şəklində mətn qaytarsın. Başlanğıc kodunun aşağı hissəsi sinfi yoxlayır — onu dəyişmə.
class Player:
# __init__(self, name): save the name, set score to 0
# add_points(self, points): add points to score
# __str__(self): return text like Aysel: 25 points
pass
aysel = Player('Aysel')
murad = Player('Murad')
aysel.add_points(10)
aysel.add_points(15)
murad.add_points(20)
print(aysel)
print(murad)▸ Gözlənilən nəticə
Aysel: 25 points Murad: 20 points
Shape sinfi hazırdır. Ondan iki alt sinif törət: Square (tərəfi side) və Rectangle (width və height). Hər biri adını ('Square', 'Rectangle') super().__init__() ilə ötürsün və öz area() metodunu yazsın. Sonra Square(4) və Rectangle(5, 3) üçün describe() nəticəsini çap et.
class Shape:
def __init__(self, name):
self.name = name
def area(self):
return 0
def describe(self):
return f'{self.name}: area {self.area()}'
# 1) class Square(Shape) with side; area = side * side
# 2) class Rectangle(Shape) with width and height
# 3) print describe() for Square(4) and Rectangle(5, 3)▸ Gözlənilən nəticə
Square: area 16 Rectangle: area 15
Əsas fikirlər
- Sinif obyektlərin çertyojudur, obyekt isə onun konkret nüsxəsidir.
__init__obyekt yaradılanda avtomatik çağırılır və atributları hazırlayır.- Metodların birinci parametri
self-dir — metodun çağırıldığı obyekt. class Dog(Animal):varislikdir:Dogvalideyn sinfin hər şeyini alır və metodları yenidən təyin edə bilər.super().__init__()törəmə sinifdə valideynin konstruktorunu çağırır.
Özünü yoxla
10 sual. Hər düzgün cavab XP qazandırır.