Python OOPs Konseptləri

Obyekt yönümlü proqramlaşdırma (OOP) nədir?

Python obyekt yönümlü proqramlaşdırma dilidir. Obyekt yönümlü proqramlaşdırma (OOP) atributları (məlumatları) və davranışları ehtiva edə bilən “obyektlər” konsepsiyasına əsaslanan proqramlaşdırma paradiqmasıdır. Başqa sözlə, Obyekt yönümlü proqramlaşdırma proqramın strukturlaşdırılması vasitəsidir ki, verilənlər və onun davranışı (metodları) bir yerdə (obyektdə) yığılsın. Proqramın necə işlədiyini başa düşməyi asanlaşdırır. Obyekt yönümlü proqramlaşdırma kodun təkrar istifadəsinə diqqət yetirir.

Obyekt yönümlü və prosedur yönümlü proqramlaşdırma:

Obyekt yönümlü proqramlaşdırmaProsedur yönümlü proqramlaşdırma
Aşağıdan Yuxarı yanaşmasını izləyirYuxarıdan-aşağı yanaşmasını izləyir
Proqram obyekt adlanan kiçik hissələrə bölünürProqram Funksiyalar adlanan kiçik hissələrə bölünür
Real dünya varlıqlarını simulyasiya edirReal dünya varlıqlarını simulyasiya etmir
Məlumatların gizlədilməsini təmin edir, buna görə də daha təhlükəsizdirMəlumatları gizlətmək üçün düzgün yol yoxdur. Buna görə daha az təhlükəsizdir
Yeni funksiyalar və məlumatlar əlavə etməklə kodu genişləndirmək daha asandırYeni funksiyalar və məlumatlar əlavə etmək asan deyil
Nümunələr: C, FORTRAN, VB və s.,Nümunələr: C++, Java, Python və s.,

Python OOPs Konsepsiyaları:

Obyekt yönümlü proqramlaşdırmanın əsas prinsipləri bunlardır:

  • Sinif
  • Obyekt
  • Üsul
  • Miras
  • Polimorfizm
  • Data Abstraksiya
  • Kapsülləşdirmə

Python OOPs Konseptləri Sinfi:

A sinif obyektlərin planıdır. Biz də müəyyən edə bilərik obyektlərin toplusu kimi sinif. Bu, bəzi xüsusi atributları və metodları olan məntiqi bir varlıqdır. Məsələn, "İşçi" sinfi üçün atributlar və davranışlar ad, yaş, təyinat, hesablama_maaş və s.,

Sinif necə yaradılır?

Python-da sinif tərifi “class” açar sözü ilə başlayır, sonra isə sinfin adı gəlir. Sinif tərifinin altında girintilənmiş kod sinfin əsas hissəsidir. Python-da sinif adları şərti olaraq Böyük hərflə başlayır.

Sintaksis:

class Employee:
   pass

Misal:

class Car:

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

    def brake(self):
        pass

    def accelerate(self):
        pass

    def gear_change(self):
        pass

    def print_car_details(self):
        print("{} is of {} color and made in year {}".format(self.model,self.color,self.year))

__init__ metodu:

__init__() Python-da konstruktordan başqa bir şey deyil. Konstruktor obyektin vəziyyətini işə salır. __init__ metodunda mövcud olan atributlar misal atributları kimi tanınır. Konstruktorun məqsədi obyekt yaradılan zaman nümunə atributlarına qiymətləri başlamaq və ya təyin etməkdir. Nümunə atributları sinfin konkret nümunəsinə (obyektinə) xasdır. __init__ metodu sinif üçün obyekt yaradılan kimi işləyir. Bizim nümunəmizdə “Avtomobil” sinfinin hər bir nümunəsinin konkret modeli, ili və rəngi var.

Defolt Konstruktor:

Sinifimizdə __init__ metodunu elan etməyi unutsaq nə olar? Proqramımızda konstruktor elan etmədiyimiz zaman Python bunu bizim üçün edir. The default konstruktor heç bir arqument qəbul etmir. Budur, standart konstruktorun nümunəsi.

class Employee:
    emp_id=101

    def display(self):
        print(self.emp_id)

emp=Employee()
emp.display()
101

Öz parametri:

'self' parametri sinfin cari nümunəsinə aiddir. Obyekt özü sinif daxilində mövcud olan istənilən metodun birinci parametri kimi keçdi. Obyekti təmsil etmək üçün konvensiya ilə “öz”dən istifadə edirik. Amma hər şey ola bilər.

class Sample():
    var=10

    def display(obj):
        print(obj.var)

s=Sample()
s.display()

Bu misalda 'self' əvəzinə biz 'obj' istifadə edirik və istədiyiniz nəticəni əldə edirik.

10

Python OOPs Konseptləri-Obyekt:

Obyekt sinifin bir nümunəsidir. Obyekt kitab, ev, karandaş və s. kimi real söz obyektlərini təmsil edir. Obyekt iki xüsusiyyətə malikdir:

  • Atributlar (məlumatlar)
  • Davranış

Məsələn, avtomobili obyekt kimi götürək. Aşağıdakı xüsusiyyətlərə və davranışlara malikdir:

Features: Model, İl, Rəng

Davranış: Əyləc, Sürətləndirmə, Ötürücü dəyişdirmə.

Bir obyekti necə yaratmaq olar?

Biz sinif adını çağırmaqla obyekti instansiya edirik.

Sintaksis:

c1=Car("Toyota",2015,"White")
>>> c1
<__main__.Car object at 0x0302CB10>

Misal:

c1=Car("Toyota",2015,"White")
c2=Car("Renault",2017,"Blue")
c1.print_car_details()
c2.print_car_details(
Toyota is of White color and made in year 2015
Renault is of Blue color and made in year 2017

Bu nümunədə sinif atributlarına daxil olmaq üçün “Car” sinfi üçün c1 və c2 obyektləri yaratdıq. Hər bir obyektin ayrıca yaddaş yeri var.

>>> c1==c2
False

Atributları və obyektləri silin:

'del' açar sözündən istifadə etməklə biz obyektin atributlarını və obyektin özünü silə bilərik.

>>> del c1.model
>>> c1.print_car_details()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "sample.py", line 18, in print_car_details
    print("{} is of {} color and made in year {}".format(self.model,self.color,self.year))
AttributeError: 'Car' object has no attribute 'model'
>>> del c1
>>> c1.print_car_details()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
NameError: name 'c1' is not defined

Sinif və nümunə atributları:

İndiyə qədər biz bir sinif, bir sinif üçün misal, konstruktor yaratmaq və obyekti və onun atributlarını necə silmək lazım olduğunu gördük. Daha əvvəl qeyd edildiyi kimi, __init__() daxilində müəyyən edilmiş atributlar obyektə xasdır və nümunə atributları kimi tanınır. __init__() xaricində müəyyən edilmiş atributlar sinif atributlarıdır. Nümunə atributuna yalnız bir obyekt daxil ola bilər. Sinif atributuna həm sinif, həm də obyektlər daxil ola bilər, çünki o, hamısı arasında paylaşılır.

Sinif atributlarına niyə ehtiyacımız olduğuna dair sual ala bilərsiniz. Hər dəfə __init__() çağırıldıqda, nümunə atributlarını işə salır. Hər dəfə yeni obyekt yaratdıqda bəzi atributların cari vəziyyətini itirməməsini istəyə bilərsiniz. Məsələn, deyək ki, müəyyən sayda banan var. Tutaq ki, hər meymun bir banan yeyir. Hər meymun yedikdən sonra bananların sayını çap etmək istəyirsiniz.

class Monkey():

    def __init__(self,No_of_bananas):
        self.No_of_bananas=No_of_bananas

    def eat(self):
        self.No_of_bananas-=1

    def display(self):
        print("Remaining Bananas :" +str(self.No_of_bananas))

No_of_bananas=10
m1=Monkey(No_of_bananas)
m2=Monkey(No_of_bananas)
m3=Monkey(No_of_bananas)
m1.eat()
m1.display()
m2.eat()
m2.display()
m3.eat()
m3.display()
Remaining Bananas :9
Remaining Bananas :9
Remaining Bananas :9

Bu, istədiyimiz nəticə deyil, elə deyilmi? Hər meymun yedikdən sonra bananların sayı azalmalıdır. Hər dəfə yeni obyekt yaradılanda cari vəziyyətini itirməyəcək sinif atributunun yeri burada işə düşür.

Misal: Sinif adından istifadə edərək sinif atributuna daxil olmaq:

class Monkey():
    #class attributes
    No_of_bananas=10
    monkey_eats_banana=1

    def eat(self):
        Monkey.No_of_bananas-=Monkey.monkey_eats_banana

    def display(self):
        print("Remaining Bananas :" +str(Monkey.No_of_bananas))

m1=Monkey()
m2=Monkey()
m3=Monkey()
m1.eat()
m1.display()
m2.eat()
m2.display()
m3.eat()
m3.display()
Remaining Bananas :9
Remaining Bananas :8
Remaining Bananas :7

Burada biz sinif adından istifadə edərək sinif atributlarına daxil oluruq və o, yaradılmış hər obyekt üçün dəyərini itirmir.

Misal: Obyektlərdən istifadə edərək sinif atributuna daxil olmaq:

Bəzi meymunlar birdən çox banan yesələr? Yalnız konkret obyekt üçün sinif atributunu dəyişə bilərik.

class Monkey():
    #class attributes
    No_of_bananas=10
    monkey_eats_banana=1

    def eat(self):
        Monkey.No_of_bananas-=self.monkey_eats_banana

    def display(self):
        print("Remaining Bananas :" +str(Monkey.No_of_bananas))

m1=Monkey()
m2=Monkey()
m1.monkey_eats_banana=2
m1.eat()
m1.display()
m2.eat()
m2.display()
Remaining Bananas :8
Remaining Bananas :7

Python OOPs Konsepsiyaları-Metodu:

Metod obyektin davranışını müəyyən edir. Metod, sinifin gövdəsində müəyyən edilmiş funksiyalar deyil. Metod sinif nümunələri üçün unikal deyil. Python-un 3 fərqli metodu var:

  • Misal metodu
  • Sinif metodu
  • Statik metod
class Myclass:

    def instance_method(self):
        pass

    @classmethod
    def class_method(cls):
        pass

    @staticmethod
    def static_method():
        pass

Bu üsulların hər birinə ətraflı baxaq.

Nümunə üsulu:

Nümunə üsulları ən çox istifadə olunur. O, birinci parametr kimi şərti olaraq özü olan sinif (obyekt) nümunəsini alır. Özün həm obyekt atributlarına, həm də sinif atributlarına çıxışı var.

Sinif metodu:

Sinif metodunu dekorator @classmethod ilə müəyyən edirik. Konvensiyaya görə 'cls' olan birinci parametr kimi sinfi qəbul edir. cls, sinfin bütün nümunələri arasında paylaşılan sinif atributlarına çıxışa malikdir. cls obyekt atributlarına daxil deyil.

Statik üsul:

Biz @staticmethod dekoratoru ilə status metodunu təyin edirik. Özünü və ya cls-i arqument kimi qəbul etmir. Beləliklə, statik metodun nə sinif atributlarına, nə də obyekt atributlarına çıxışı var. O, normal funksiya kimi işləyir, lakin sinfin ad sahəsinə aiddir.

Misal:

from datetime import date

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

    @classmethod
    def Toyota(cls):
        return cls("Toyota",2015,"White")

    @staticmethod
    def find_age(year):
        return date.today().year-year

    def display(self):
        age=Car.find_age(self.year)
        print('{} is of {} color and {} years old'.format(self.model,self.color,age))

c1=Car("Renault",2017,"Blue")
c1.display()
c2=Car.Toyota()
print(c2)
c2.display()
Renault is of Blue color and 3 years old
<__main__.Car object at 0x0549CD90>
Toyota is of White color and 5 years old

Yuxarıdakı nümunədən belə nəticəyə gələ bilərik:

  • 'Car.Toyota()' sinif obyekti yaradır.
  • Statik metod müntəzəm funksiya kimi fəaliyyət göstərir. Lakin o, sinif ad sahəsinə aiddir və arqumentlərdə verilən məlumatlar üzərində işləyir.

Python OOPs Konseptləri - Miras:

Varislik bizə başqa sinifdən xassələri əldə edən və ya miras alan bir sinfi təyin etməyə imkan verir. Yeni sinif törəmə və ya əsas sinif kimi tanınır, uşaq sinifin miras aldığı sinif isə Ana sinif kimi tanınır. Vərəsəliyin əsas üstünlüyü kodun təkrar istifadəsidir. Biz həmçinin, tələb olunarsa, ana sinfi dəyişdirmədən uşaq sinfinə yeni funksiyalar əlavə edə bilərik.

Sintaksis:

class childclass_name(parentclass_name)

Misal:

Biz iki sinif yaradırıq: Şəxs və İşçi. İşçi həm də bir şəxs olduğundan, biz işçi sinfini uşaq sinfi kimi yaradırıq.

class Person:
    def __init__(self,name):
        self.name=name
    def is_empolyee(self):
        return False
    def display(self):
        return self.name

class Employee(Person):
    def is_empolyee(self):
        return True

obj1=Person("Person1")
print(obj1.display(),obj1.is_empolyee())
obj2=Employee("Person2")
print(obj2.display(),obj2.is_empolyee())
Person1 False
Person2 True

__init__ və göstərmə metodları yalnız əsas sinifin bir hissəsi olsa da, uşaq sinif bu metodlara daxil ola bilər. Eyni üsul həm uşaq, həm də valideyn sinifində mövcuddursa, uşaq sinfinə üstünlük verilir.

Vərəsəlik növləri:

Tək miras:

Uşaq sinfi yalnız bir valideyndən miras alırsa, o, tək miras kimi tanınır. Yuxarıda gördüyümüz nümunə tək miras nümunəsidir.

Çoxlu miras:

Java və C++-dan fərqli olaraq, Python çoxlu varisliyi dəstəkləyir.

Uşaq sinifi birdən çox əsas sinifdən miras aldıqda, o, çoxlu miras kimi tanınır. Burada ana siniflər mötərizə içərisində vergüllə ayrılaraq qeyd olunur.

class Base1:
    def __init__(self):
        self.str1='Base class 1'

class Base2:
    def __init__(self):
        self.str2='Base class 2'

class Derived(Base1,Base2):
    def __init__(self):
        Base1.__init__(self)
        Base2.__init__(self)
    def display(self):
        print(self.str1,self.str2)

d=Derived()
d.display()
Base class 1 Base class 2

Uşaq sinifdə ana sinifin misal dəyişənlərinə daxil olmaq üçün biz ana sinifin __init__() funksiyasını çağırmalıyıq.

Çoxsəviyyəli miras:

Çoxsəviyyəli miras valideyn-nəvə münasibətini təmsil edir. Valideyn sinifindən uşaq sinfi və nəvə sinfi uşaq sinifindən miras qalır.

class Parent:
    def __init__(self):
        self.str1='Parent class'
        print(self.str1)

class Child:
    def __init__(self):
        Parent.__init__(self)
        self.str2='Child class'
        print(self.str2)

class GrandChild(Child):
    def __init__(self):
        Child.__init__(self)
    def display(self):
        print("Sub class of child class")

d=GrandChild()
d.display()
Parent class
Child class
Sub class of child class

İerarxik varislik:

Tək valideyn sinifində birdən çox uşaq sinfi var.

Hibrid miras:

Bu, birdən çox miras növünün birləşməsidir.

super() açar sözü:

istifadə edərək əsas sinif obyektinə müraciət edə bilərik super açar söz. Bu, bizə əsas sinif adından açıq şəkildə istifadə etməməyə imkan verir. Üstünlük ondan ibarətdir ki, hər dəfə baza sinifinin adı dəyişdirildikdə, super() açar sözündən istifadə edərək baza sinif obyektinə istinad etsək, adın dəyişdirilməli olduğu yerlərin sayını azalda bilərik.

class Parent1:
    def __init__(self):
        self.str1='Parent class 1'
    def display(self):
        print(self.str1)

class Parent2:
    def __init__(self):
        self.str2='Parent class2'
    def display(self):
        print(self.str2)

class Child(Parent2,Parent1):
    def display(self):
        print("Child class")
        super().display()

c=Child()
c.display()
Child class
Parent class2

Birdən çox ana sinifimiz olduqda, super() açar sözü mötərizədə ilk görünən əsas sinfə aiddir.

Python OOPs Konseptləri-Polimorfizm:

Polimorfizm sözü yunanca Poly(çox) və morfizm(formalar) sözlərindəndir. Proqramlaşdırmada Polimorfizm bir obyektin bir çox forma alması və bu obyektlərin hər birini öz xüsusiyyətlərinə əsasən fərqli şəkildə emal etmək qabiliyyəti deməkdir. məlumat növü.

Nümunələr:

Daxili polimorf funksiya:

len funksiyasının istifadəsi arqumentin növündən asılı olmayaraq qəbul etdiyi arqumentin uzunluğunu qaytarmaqdır. Arqumentin növü sətir, tuple, siyahı və s. ola bilər, buna görə də polimorfizm nümunəsidir.

print(len('abcdgf'))
print(len([1,2,'a','m','n']))
print(len(('p','1',[1,2,3],'q')))
6
5
4

Funksiya və obyektlərlə polimorfizm:

class Carrot():
    def type(self):
        print('Vegetable')
    def color(self):
        print('Orange')

class Mango():
    def type(self):
        print('Fruit')
    def color(self):
        print('Yellow')

def func(obj):
    obj.type()
    obj.color()


c=Carrot()
m=Mango()
func(c)
func(m)
Vegetable
Orange
Fruit
Yellow

Yuxarıdakı misalda obyekti arqument kimi qəbul edən func() funksiyamız var. Obyektin növündən asılı olmayaraq, func() obyektin metodunu çağırır və düzgün nəticəni qaytarır. Burada func() daxilində çağırdığımız metodların bütün siniflərdə mövcud olduğunu fərz edirik.

İrsiyyətlə polimorfizm:

Məsələni nəzərdən keçirək. Bizim 'sahəni_hesabla' metoduna malik olan 'Shape' baza sinifimiz var. Əsas sinifdə iki uşaq sinfi var: Dairə və Kvadrat. Varislikdə uşaq sinif əsas sinfin metodlarını miras alır. Lakin sahəni hesablamaq üçün formula formadan asılı olaraq dəyişir. Bütün uşaq sinifləri üçün sahəni hesablamaq üçün eyni düsturdan istifadə etsək, düzgün nəticə əldə edə bilməyəcəyik. Polimorfizm bizə əsas siniflə eyni adlı uşaq siniflərində metodları müəyyən etməyə imkan verir. Beləliklə, biz uşaq siniflərinin hər birində 'sahəni_hesabla' metodunu yenidən müəyyən edə bilərik. Uşaq sinifində metodun yenidən müəyyən edilməsi prosesi kimi tanınır Metodu dəyişdirmək.

import math

class Shape:
    def calculate_area(self):
        pass

class Circle(Shape):
    def __init__(self, radius):
        self.radius=radius
    def calculate_area(self):
        return math.pi*self.radius**2

class Square(Shape):
    def __init__(self, side):
        self.side=side
    def calculate_area(self):
        return self.side**2

c=Circle(3)
s=Square(4)
print(c.calculate_area())
print(s.calculate_area())
28.274333882308138
16

Python OOPs Konseptləri-Abstraksiya:

Abstraksiya mürəkkəbliyi gizlətmək və obyektin yalnız əsas xüsusiyyətlərini göstərmək deməkdir. Beləliklə, istifadəçi işin necə edildiyini deyil, nə etdiyini bilir.

Məsələn, istifadəçi altında nə baş verdiyini bilmədən avtomobili idarə edir.

Python-da biz Abstract sinifləri və Interface istifadə edərək abstraksiyaya nail oluruq.

İnterfeys:

İnterfeys metod gövdələri olmayan metodları təmin edir. İnterfeysdə müəyyən edilmiş metodlar üçün uşaq siniflər həyata keçirməyi təmin edir. Python-da açıq şəkildə İnterfeys yarada bilmədiyimiz üçün abstrakt sinifdən istifadə etməliyik.

Abstrakt Sinif:

Bir və ya bir neçə mücərrəd metodu ehtiva edən sinif Abstrakt sinif kimi tanınır. Mücərrəd metod heç bir icrası olmayan yalnız bəyannaməyə malik olan metoddur. Abstrakt sinifdən qurulmuş bütün uşaq siniflər bu mücərrəd metodları ehtiva etməlidir. Uşaq sinifləri abstrakt metodların həyata keçirilməsini təmin edir. Mücərrəd sinfi digər siniflər üçün plan kimi də müəyyən edə bilərik. Böyük funksional vahidləri dizayn etməli, komponentin müxtəlif tətbiqləri üçün ümumi interfeys təmin etməli olduğumuz zaman abstrakt sinifdən istifadə edirik və s.,

Yalnız abstrakt metodları ehtiva edən sinif kimi tanınır Interface.

Python-da Abstract Base Class (ABC):

Python-da abc modulu Abstract Base Classes (ABC) müəyyən etmək üçün baza təmin edir. Biz metodu @abstractmethod ilə bəzəyərək abstrakt metod müəyyən edirik.

from abc import ABC, abstractmethod

class Payment(ABC):
    def payment_amount(self, amount):
        print("You need to pay amount : {}".format(amount))

    #abstract method
    @abstractmethod
    def payment(self):
        pass

class CreditCardPayment(Payment):
    #overriding abstract method
    def payment(self):
        print('Amount successfully paid uisng credit card')

class MobileWalletPayment(Payment):
    #overriding abstract method
    def payment(self):
        print('Amount successfully paid uisng Mobile wallet')

c=CreditCardPayment()
c.payment_amount(1000)
c.payment()
m=MobileWalletPayment()
m.payment_amount(1050)
m.payment()
You need to pay amount : 1000
Amount successfully paid uisng credit card
You need to pay amount : 1050
Amount successfully paid uisng Mobile wallet

Ani abstrakt sinif:

Mücərrəd sinif üçün obyekt yarada bilmirik, çünki o, natamamdır. Abstract sinfində icrası olmayan abstrakt metodlar var. Beləliklə, biz abstrakt sinifdən yalnız şablon kimi istifadə etməliyik və ehtiyacdan asılı olaraq onu genişləndirə bilərik.

from abc import ABC, abstractmethod

class Payment(ABC):
    def payment_amount(self, amount):
        print("You need to pay amount : {}".format(amount))

    #abstract method
    @abstractmethod
    def payment(self):
        pass

p=Payment()
Traceback (most recent call last):
  File "sample.py", line 12, in <module>
    p=Payment()
TypeError: Can't instantiate abstract class Payment with abstract methods payment

Abstract baza sinfində konkret üsullar:

Beton sinfi yalnız normal (beton) metodları ehtiva edir. halbuki abstrakt sinif həm normal, həm də konkret metodları ehtiva edir. Konkret metodları ehtiva edən mücərrəd baza sinfi icranı təmin edə bilər və biz onları super() açar sözü ilə çağırmalıyıq.

from abc import ABC

class Parent(ABC):
    #Concrete method
    def display(self):
        print("This is an Abstract Base Class")

class Child(Parent):
    def display(self):
        super().display()
        print("This is a child class")

c=Child()
c.display()
This is an Abstract Base Class
This is a child class

Python OOPs Konsepsiyaları-Enkapsulyasiya:

İnkapsulyasiya məlumatların və metodların bir vahid daxilində saxlanması ideyasıdır. Bu, məlumatlara və metodlara birbaşa girişi məhdudlaşdırmaqla, məlumatların təsadüfən dəyişdirilməsinin qarşısını alır. Buna nail olmaq üçün dəyişənləri ya olaraq elan edə bilərik

  • xüsusi
  • müdafiə

özəl dəyişənlər:

Biz dəyişəni özəl olaraq elan etdikdə, yalnız obyektin metodu obyektin dəyişəninə daxil ola bilər. Şəxsi dəyişənlərə sinifdən kənar daxil olmaq qadağandır. Python-da biz dəyişən adının üzərinə qoşa alt xətt '__' qoyaraq özəl dəyişəni elan edirik.

qorunan dəyişənlər:

Qorunan dəyişənlərə sinif və onun alt sinifləri tərəfindən daxil oluna bilər. Python-da biz dəyişənin adını tək alt xətt '_' ilə prefiks etməklə qorunan dəyişəni elan edirik.

Real həyat ssenarisi:

İnkapsulyasiyanın real həyat nümunəsini nəzərdən keçirək. Bir şirkətdə maliyyə, mühasibat, satış və s. kimi müxtəlif şöbələr var, bu şöbələrin hər biri öz məlumatları ilə məşğul olur. Məsələn, maliyyə şöbəsi maliyyə məlumatlarını, satış şöbəsi isə satış məlumatlarını idarə edir. Fərz edək ki, maliyyə departamentlərindən bir adamın satış məlumatlarına ehtiyacı olduğu bir vəziyyət var. O, satışla bağlı məlumatlara birbaşa daxil ola bilməz. O, satış məlumatlarına daxil olmaq üçün satış departamentindən bir şəxslə əlaqə saxlamalıdır. İnkapsulyasiyanın gəldiyi yer budur. İnkapsulyasiyadan istifadə edərək, biz satış departamentinin məlumatlarını və işçilərini bir sinif altında yığırıq. Beləliklə, satış məlumatlarına həmin sinifdən kənar heç kim daxil ola bilməz.

Nümunə – qorunan dəyişən:

Sinif və onun alt sinifləri qorunan dəyişənə daxil ola bilər.

class Base:
    def __init__(self):
        #protected variable
        self._a=10

class Derived(Base):
    def __init__(self):
        Base.__init__(self)
        print(self._a)

b=Base()
d=Derived()
10

Misal – özəl dəyişən:

Sinifdən kənar şəxsi dəyişənə daxil olmaq mümkün deyil.

class Base:
    def __init__(self):
        #private varaible
        self.__a=10

class Derived(Base):
    def __init__(self):
        Base.__init__(self)
        print(self.__a)

b=Base()
d=Derived()
Traceback (most recent call last):
  File "sample.py", line 12, in <module>
    d=Derived()
  File "sample.py", line 9, in __init__
    print(self.__a)
AttributeError: 'Derived' object has no attribute '_Derived__a'

 

Translate »