Python dərs 6 — OOP

Hasan Jafarov
4 min readMar 9, 2020

--

Bir çox proqramlaşdırma dilində olduğu kimi pythonda da obyektyönümlü kod yazmaq mümkündür(OOP). OOP-un əsas məqsədi bir kodu vəya kod blokunu ya da ümumi bir mqəsəd üçün istifadə olunan kodları bir yerdə yazıb proqramın hər hansı bir yerində işlədə bilməkdir. OOP deyəndə ağla ilk gələn yəqinki class-lardır. Pytonda classlar iki cür yazılır.

pass sözü heç bir şey etməz. Sadəcə syntax təkcə class a: şəklində yazılanda qəbul etmir. Hər bir class-ın body hissəsi də olmalıdır. Bizdə syntax xətası olmasın deyə class-ın içinə “heçnə”(pass) yazdıq.

OOP-un əsas prinsipləri abstraction, encapsulation, polymorphism( və ya inheritance) -dir. Əvvəlcə sadə sinif nümunələrinə baxaq daha sonra OOP-un əsas prinsiplərinə təkrar qayıdacayıq. Sadə bir car class-ı yaradaq.

Yuxarıdakı kodda bir car classı yaratdıq. car classı içində həm classa aid həm də instance-a aid attributlar təyin etdik. Daha sonra həm classın həm də instanceların bu attributları necə istifadə edə bildiyinə baxdıq. Constructor metodu pythonda necə yazıldığını da bu nümunədə gördük. Pythonda bütün constructor metodlar __init__(self) şəklində yazılır. Burada self məcburi deyil ilk argument hər hansı adda yazmaq olar yəni məsələn constructor metodunu __init__(this), __init__(a) şəklində yazmaq da olar. self bir keyword deyil, ancaq demək olar ki class metodlarında self yazmaq vərdiş olub və demək olar hər yerdə yazılmış kod nümunələrində bu ilk argumentin adını self şəklində görəcəksiz.

Classda atributlar haqqında daha bir kod nümunəsinə baxaq.

Yuxarıdakı nümunədə getattr, setattr, delattr və hasattr istifadəsini gördük.
Birdə default olaraq hər bir classın built-in yəni classın özündə gələn atributları var. Bunlar __doc__, __dict__, __name__, __module__, __bases__ attributlarıdır.

Result:

car1.__doc__ : bu class test üçün yazılıb

car1.__name__ : car

car1.__dict__ : {‘__module__’: ‘__main__’, ‘__doc__’: ‘bu class test\n üçün yazılıb’, ‘__dict__’: <attribute ‘__dict__’ of ‘car’ objects>, ‘__weakref__’: <attribute ‘__weakref__’ of ‘car’ objects>}

car1.__module__ : __main__

car1.__bases__ : (<class ‘object’>,)

— — — — — instance — — —

car1.__doc__ : bu class test

üçün yazılıb

car1.__dict__ : {}

car1.__module__ : __main__

Bu kod nümunəsindən göründüyü kimi __name__ və __bases__ atributları instance üçün istifadə oluna bilməz.

Classda constructor instance yaradılanda işləyir eyni qaydada destructor da var ki bu da yaradılan instance silinəndə çalışır. Destructur __del__(self) şəklində yazılır. Construcorda olduğu kimi self məcburidir.

Atribut əvəzinə variable da deyilir. İkisi də eynidir. Pythonda bütün atributlar, metodlar və s default olaraq public olaraq yaradılır. Bəs private bir atribut yaratmaq istəsək nə etməliyik? Bunun üçün atributun əvvəlinə __ yazmaq kifayətdir. Bəli iki dənə alt xətt yazanda avtomatik olaraq atribut private olur və sadəcə class içində onu istifadə etmək mümkün olur. Aşağıdakı kod nümunəsində OOP-un əsas prinsiplərindən encapsulation-nun pythonda necə tətbiq edildiyini və getter setter necə yazıldığını görə bilərsiniz.

Pythonda getter setteri bu şəkildə yazsaqda əslində propertylərlə yazmaq doğrudur. Pythonda yeni property @property ilə yazılır. Yəni car1.getreng və cat1.setreng yerine sadəcə cat1.reng yaza bilərik mi? Təbi ki yaza bilərik. Belə bir nümunəyə baxaq.

result:

qirmizi

yeni reng: sari

sari

Aşağıdakı nümunədə həm setter həm getter həm deleter nümunəsinə baxaq.

İndi də Pythonda classlarda metodlar necə yazılır ona baxaq. Pythonda 3 cür metod var: instance metod, statik metod, class metodu.

Instance metod classın özünə aid olmur sadəcə classdan obyekt yaratdıqdan sonra çağrılabilir və ilk arqument olaraq obyektin özünü alır(self). Statik metod hər hansı gizli arqument almır. Daha dəqiq desək statik metodlar hansı classdan çağrıldığını bilmir. Statik metodu klas içində və ya başqa yerdə yazmağın heç bir fərqi yoxdur. Bundan fərqli olaraq class metodlar ilk arqument olaraq həmin classı alır. Bu ilk arqument cls-dir və self kimi gizli arqumentdir və məcburidir. Aşağıdakı koddan daha aydın olacaq.

result:

-----car------

Static metod 2

Class method 3

-----car1------

Instance metod 1

Static metod 4

Class method 5

-----car2------

Instance metod 1

Static metod 6

Class method 7

-----------------

<function car.suret at 0x7f1db8510700>

<function car.suretstatic at 0x7f1db8510790>

<bound method car.suretclass of <class '__main__.car'>>

<bound method car.suret of <__main__.car object at 0x7f1db85a3e20>>

<function car.suretstatic at 0x7f1db8510790>

<bound method car.suretclass of <class '__main__.car'>>

Pythonda metod overloading default olaraq yoxdur. Fərqli yollarla və library-lərlə metodu overload etməyin yolları var. Ancaq default olaraq pythonda istifadə etmək olmur. Metodu overload etmək istəsək yəni eyni adda və fərqli sayda parametri olan metod yazmaq istədikdə metod overload yox metod override olur. Yəni ən sonuncu yazılan metod əvvəlkiləri əzir.

Burdan da görürük ki cüt parametrli metod tək parametrli metodu override edib yəni əzib.

Bəs əgər biz həqiqətən də overload istifadə etməyə məcburuq və istifadə etmək istəyiriksə onda belə bir həll yolu tapa bilərik.

İndi də OOP-un əsas prinsiplərindən olan inheritance-ə baxaq. Inheritance bir sinifin digərindən miras almasıdır. Başqa cür desək parent classdan child classlar törəməsidir. Parent classa base class child classa derived class deyilir.Aşağıdakı nümunədə Pythonda inheritance necə baş verir onu görə bilərik.

result:

child truck class

base class

<class '__main__.truck'>

2019

6

from base class

base class

<class '__main__.motorcycle'>

2021

2

from base class

child car class

base class

<class '__main__.car'>

20184

from base class

car is a <class '__main__.car'> and my truck is a <class '__main__.truck'>

False True True True False

Hər instance-da Base classdan child class-a test atributu gəldi. isinstance və issubclass ilə obyektin classın instance olduğunu və hansı classın subclassı olduğu öyrənmək olar.

Eyni vaxtda birdən çox klasdan da törəmə alına bilər. Pythonda bir multiple inheritance nümunəsinə baxaq. Eyni inheritanceda olduğu kimi Base klaslar parametr kimi ötürülür child klasa.

result:

method1 metodu superclass1-dən çağrıldı

method2 metodu superclass1-dən çağrıldı

child metod

superclass1

superclass2

childclass

Multiple inheritance-ə aid daha bir nümunəyə baxaq.

result:

rezident 15/09/2006 Həsən cəfərov 30 Telebe ID: 386

Həsən cəfərov

386

Başqa proqramlaşdırma dillərindən bildiyimiz interface pythonda yoxdur. Çünki onsuzda python multiple class inheritance-i dəstəkləyir. Buna görə də Pythonda kod yazarkən interfeysə ehtiyac olmayacaq. Bəs Pythonda abstract anlayışı var mı. Əslində demək olar ki var. Klasımızı aşağıdakı şəkildə yazsaq ona abstract class deyə bilərik.

Sonra bu klasımızdan hər hansı klaslar yaratsaq bu metodlar həmin klaslara keçəcək. Abstract atributlar və ya propertylər isə belə yazıla bilər.

Son olaraq pythonda operator overload necə olur onu aşağıdakı kodda görə bilərik.

result:

A(6,12)

A(2,4)

A(8,32)

A(testtesttesttest,48)

A(2.0,2.0)

A(6,12)

A(2,4)

A(8,32)

A(testtesttesttest,48)

A(2.0,2.0)

Vurma, bölmə, toplama və çıxma əməliyyatlarını yazdığımız klas üçün necə overloa eləyə bildiyimizi gördük. Digər overload metodları aşağıdakı kimidir.

Bunları öz yazdığınız klaslarda yoxlayaraq operator overload mövzusunu daha yaxşı başa düşə biləcəksiz.

--

--

No responses yet