Skip to content

Latest commit

 

History

History
291 lines (209 loc) · 8.06 KB

File metadata and controls

291 lines (209 loc) · 8.06 KB

Fəsil 7: Obyekt-Yönümlü Proqramlaşdırma

Mündəricat

OOP və Sinif Konsepsiyaları

Obyekt-Yönümlü Proqramlaşdırma (OOP) obyektlər və siniflərdən istifadə edərək kodu strukturlaşdıran proqramlaşdırma paradiqmasıdır. Sinif obyektlər yaratmaq üçün bir şablondur və obyekt sinifin bir nümunəsidir.

Sinifin Tərifi

Sinif class açar sözü, sinif adı və iki nöqtə ilə təyin edilir. Sinif metodlar (funksiyalar) və atributlar (dəyişənlər) ehtiva edir.

class Car:
    def __init__(self, brand, model, year, color):
        self.brand = brand
        self.model = model
        self.year = year
        self.color = color

    def drive(self):
        print(f"{self.brand} {self.model} sürülür...")

    def stop(self):
        print(f"{self.brand} {self.model} dayanır...")

car1 = Car("BMW", "X5", 2021, "Qara")
car2 = Car("Ford", "Mustang", 2022, "Mavi")

car1.drive()
car2.drive()
car1.stop()

Çıxış:

BMW X5 sürülür...
Ford Mustang sürülür...
BMW X5 dayanır...

İzah: Car sinifinin atributlarını başlatan __init__ metodu var. drivestop metodları sinifin davranışını təyin edir. Biz Car sinifinin iki nümunəsini yaradırıq və onların metodlarını çağırırıq.

Atributlar və Metodlar

Atributlar sinifə aid olan dəyişənlərdir və metodlar sinifə aid olan funksiyalardır.

class Person:
    def __init__(self, name, age):
        self.name = name
        self.age = age

    def greet(self):
        print(f"Salam, mənim adım {self.name} və mən {self.age} yaşındayam.")

person1 = Person("Alice", 30)
person1.greet()

Çıxış:

Salam, mənim adım Alice və mən 30 yaşındayam.

İzah: Person sinifinin iki atributu, nameage, və bir metodu, greet, var. greet metodu atributlardan istifadə edərək salam mesajı çap edir.

Dunder (Sehrli) Metodlar

Dunder (Double UNDERscore) metodlar, həmçinin sehrli metodlar kimi tanınır, Python-da iki alt xətt ilə başlayan və bitən xüsusi metodlardır. Onlar obyektlərin daxili əməliyyatlar üçün davranışını təyin etməyə imkan verir.

Nümunə: Dunder Metodlar

class Character:
    def __init__(self, name):
        self.name = name
        self.health = 100
        self.arr = ['A', 'B', 'C']

    def is_died(self):
        return self.health == 0

    def damage(self, value):
        self.health = max(0, self.health - value)

    def __str__(self):
        return f"{self.name} ilə {self.health}HP"

    def __len__(self):
        return self.health

    def __getitem__(self, item):
        return self.arr[item]

    def __eq__(self, other):
        return self.health == other.health

    def __lt__(self, other):
        return self.health < other.health

    def __add__(self, other):
        return self.health + other.health

alpha = Character(name="Alpha")
beta = Character(name="Beta")

print(len(alpha))
print(alpha)
print(alpha[1])
print(alpha == beta)
alpha.damage(75)
print(alpha < beta)
print(alpha + beta)

Çıxış:

100
Alpha ilə 100HP
B
Doğru
Doğru
125

İzah: Character sinifi bir neçə dunder metodunu təyin edir ki, onun davranışını fərdiləşdirsin. __str__ metodu obyektin sətir təsvirini təyin edir, __len__ metodu obyektin uzunluğunu (sağlamlıq) qaytarır və __getitem__ metodu indeksləşdirməyə imkan verir. __eq__, __lt____add__ metodları bərabərlik, kiçik və toplama əməliyyatlarını təyin edir.

İrsi

İrsi bir sinifin başqa bir sinifdən atributlar və metodlar miras almasına imkan verir. Miras alan sinif uşaq sinif adlanır və miras alınan sinif valideyn sinif adlanır.

Nümunə: İrsi

class Person:
    def __init__(self, full_name, age):
        self.full_name = full_name
        self.age = age

    def greet(self):
        print(f"Salam!")

    def show_info(self):
        print("Tam Ad:", self.full_name)
        print("Yaş:", self.age)

class Student(Person):
    def __init__(self, full_name, age, grade):
        super().__init__(full_name, age)
        self.grade = grade

    def say_grade(self):
        super().greet()
        print(f"{self.full_name}'nin qiyməti {self.grade}")

    def show_info(self):
        super().show_info()
        print("Qiymət:", self.grade)

student1 = Student('John Doe', 13, 7)
person1 = Person("Nazim Ramazanli", 30)

student1.say_grade()
student1.show_info()
person1.show_info()

Çıxış:

Salam!
John Doe'nin qiyməti 7
Tam Ad: John Doe
Yaş: 13
Qiymət: 7
Tam Ad: Nazim Ramazanli
Yaş: 30

İzah: Student sinifi Person sinifindən miras alır. O, valideyn sinifinin metodlarını və atributlarını çağırmaq üçün super() funksiyasından istifadə edir. Student sinifi yeni atribut grade əlavə edir və show_info metodunu yenidən təyin edir.

@staticmethod

@staticmethod dekoratoru sinifin nümunəsi olmadan çağırıla bilən statik metodu təyin edir. Statik metodlar nümunə (self) və ya sinif (cls) dəyişənlərinə çıxış əldə etmir.

Nümunə: @staticmethod

class Calculator:
    @staticmethod
    def add(x, y):
        return x + y

    @staticmethod
    def subtract(x, y):
        return x - y

print(Calculator.add(3, 4))
print(Calculator.subtract(10, 5))

Çıxış:

7
5

İzah: Calculator sinifi @staticmethod dekoratorundan istifadə edərək iki statik metod, addsubtract, təyin edir. Bu metodlar sinifdə nümunə yaratmadan birbaşa çağırıla bilər.

@classmethod

@classmethod dekoratoru sinif metodunu təyin edir ki, bu da sinifi özü (cls) birinci arqument kimi qəbul edir. Sinif metodları sinif səviyyəli dəyişənlərə çıxış əldə edə və onları dəyişdirə bilər.

Nümunə: @classmethod

class Student:
    student_count = 0
    instances = []

    def __init__(self, name, score):
        self.name = name
        self.score = score
        Student.student_count += 1
        Student.instances.append(self)

    @classmethod
    def get_student_count(cls):
        return f"Tələbə sayı: {cls.student_count}"

    @classmethod
    def convert(cls, students):
        result = []
        for student in students:
            result.append(cls(student["name"], student["score"]))
        return result

bob = Student('Bob', 93)
alice = Student('Alice', 89)
mark = Student('Mark', 75)

print(Student.get_student_count())

data = [
    {"name": "Nihad", "score": 95},
    {"name": "Akif", "score": 83},
    {"name": "Nilay", "score": 94},
]

converted_data = Student.convert(data)
print(*[f"{instance.name}'nin balı {instance.score}" for instance in converted_data], sep='\n')

Çıxış:

Tələbə sayı: 3
Nihad'ın balı 95
Akif'in balı 83
Nilay'ın balı 94

İzah: Student sinifi @classmethod dekoratorundan istifadə edərək iki sinif metodu, get_student_countconvert, təyin edir. get_student_count metodu tələbə nümunələrinin sayını qaytarır və convert metodu lüğətlər siyahısını Student nümunələri siyahısına çevirir.

Xülasə

Bu fəsildə biz Obyekt-Yönümlü Proqramlaşdırma konsepsiyalarını, siniflərin təyin edilməsini, dunder (sehrli) metodları, irsi, statik metodları və sinif metodlarını əhatə etdik.

Tapşırıqlar

  1. Animal sinifini namespecies atributları və speakinfo metodları ilə təyin edin.
  2. Animal sinifindən miras alan və yeni bark metodu əlavə edən Dog alt sinifini yaradın.
  3. Əlavə, çıxarma, vurma və bölmə üçün statik metodları olan MathOperations sinifini təyin edin.
  4. İşçilərin sayını izləmək və lüğətlər siyahısını Employee nümunələri siyahısına çevirmək üçün sinif metodları olan Employee sinifini təyin edin.

Növbəti Fəsil: İrəli Mövzular