Mündəricat
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ırma | Prosedur yönümlü proqramlaşdırma |
---|---|
Aşağıdan Yuxarı yanaşmasını izləyir | Yuxarıdan-aşağı yanaşmasını izləyir |
Proqram obyekt adlanan kiçik hissələrə bölünür | Proqram Funksiyalar adlanan kiçik hissələrə bölünür |
Real dünya varlıqlarını simulyasiya edir | Real dünya varlıqlarını simulyasiya etmir |
Məlumatların gizlədilməsini təmin edir, buna görə də daha təhlükəsizdir | Mə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ır | Yeni 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'