Məzmuna keç
Educora
İrəli20 dəq13 / 42

Obyektyönlü proqramlaşdırma: siniflər və obyektlər

Verilənləri və davranışı bir yerdə birləşdir: siniflər, obyektlər, __init__, metodlar, self və varislik.

Özünü yoxla
Bu dərsdə öyrənəcəksən
  • 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.

TerminMənasıNümunədə
Sinifobyektlərin çertyojuStudent
Obyektsinifdən yaradılmış nüsxəaysel
Atributobyektin daxilindəki dəyişənself.name
Metodobyektin daxilindəki funksiyaaverage()

İlk sinif

Python
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.
  • self metodun çağırıldığı obyektin özüdür. Məsələn, aysel.add_score(5) yazanda self elə aysel deməkdir.
  • __str__ obyektin print ilə 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:

Python
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:

Python
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
Tapşırıq

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ə.

Tapşırıq · Python
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
Tapşırıq

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.

Tapşırıq · Python
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: Dog valideyn 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.

1 / 10
Sinif nədir?